結果

問題 No.854 公平なりんご分配
ユーザー beet
提出日時 2019-07-26 21:43:10
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 2,628 ms / 3,153 ms
コード長 4,479 bytes
コンパイル時間 2,896 ms
コンパイル使用メモリ 220,772 KB
最終ジャッジ日時 2025-01-07 07:48:15
ジャッジサーバーID
(参考情報)
judge3 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 92
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

#include<bits/stdc++.h>
using namespace std;
using Int = long long;
//BEGIN CUT HERE
struct Mo{
using F = function<void(Int)>;
vector<Int> ls,rs,ord;
Int n,width,nl,nr,ptr;
vector<bool> flg;
F expand,shrink;
Mo(Int n,Int width,F expand,F shrink):
n(n),width(width),nl(0),nr(0),ptr(0),flg(n,0),
expand(expand),shrink(shrink){}
void add(Int l,Int r){
ls.emplace_back(l);
rs.emplace_back(r);
}
void build(){
ord.resize(ls.size());
iota(ord.begin(),ord.end(),0);
sort(ord.begin(),ord.end(),
[&](Int a,Int b){
if(ls[a]/width!=ls[b]/width) return ls[a]<ls[b];
return bool((rs[a]<rs[b])^((ls[a]/width)&1));
});
}
Int process(){
if(ptr==(Int)ord.size()) return -1;
const Int idx=ord[ptr++];
while(nl>ls[idx]) calc(--nl);
while(nr<rs[idx]) calc(nr++);
while(nl<ls[idx]) calc(nl++);
while(nr>rs[idx]) calc(--nr);
return idx;
}
inline void calc(Int idx){
flg[idx].flip();
if(flg[idx]) expand(idx);
else shrink(idx);
}
};
//END CUT HERE
template<typename T>
map<T, Int> factorize(T x){
map<T, Int> res;
for(Int i=2;i*i<=x;i++){
while(x%i==0){
x/=i;
res[i]++;
}
}
if(x!=1) res[x]++;
return res;
}
template<typename T>
vector<T> make_v(size_t a){return vector<T>(a);}
template<typename T>
vector<vector<T> > make_v(size_t a,size_t b){
return vector<vector<T> >(a,make_v<T>(b));
}
template<typename T>
vector<vector<vector<T> > > make_v(size_t a,size_t b,size_t c){
return vector<vector<vector<T> > > (a,make_v<T>(b,c));
}
template<typename T,typename V>
typename enable_if<is_class<T>::value==0>::type
fill_v(T &t,const V &v){t=v;}
template<typename T,typename V>
typename enable_if<is_class<T>::value!=0>::type
fill_v(T &t,const V &v){
for(auto &e:t) fill_v(e,v);
}
class EulerTourForEdge{
private:
vector<Int> ds,us,dep,btm;
void dfs(Int v,Int p,Int d){
dep[v]=d;
for(Int u:G[v]){
if(u==p) continue;
ds[u]=btm.size();
btm.emplace_back(u);
dfs(u,v,d+1);
us[u]=btm.size();
btm.emplace_back(u);
}
}
public:
vector<vector<Int> > G;
EulerTourForEdge(){}
EulerTourForEdge(Int n):
ds(n),us(n),dep(n),G(n){}
void add_edge(Int u,Int v){
G[u].emplace_back(v);
G[v].emplace_back(u);
}
void build(Int r=0){
btm.clear();
ds[r]=btm.size();
btm.emplace_back(r);
dfs(r,-1,0);
us[r]=btm.size();
btm.emplace_back(r);
}
Int child(Int u,Int v){
return dep[u]<dep[v]?v:u;
}
Int bottom(Int e){
return btm[e];
}
// lca(u, v) must be u or v
template<typename F>
void query(Int u,Int v,F f){
if(dep[u]>dep[v]) swap(u,v);
f(ds[u]+1,ds[v]+1);
}
template<typename T,typename G>
void update(Int v,T x,G g){
g(ds[v], x);
g(us[v],-x);
}
};
//INSERT ABOVE HERE
signed DWANGO2017FINAL_B(){
using ll = long long;
Int n;
cin>>n;
vector<Int> x(n);
for(Int i=0;i<n;i++) cin>>x[i];
const Int RT = 40;
auto acc=make_v<Int>(RT,n+1);
fill_v(acc,0);
using P = pair<Int, Int>;
vector<vector<P> > v(n);
for(Int i=0;i<n;i++){
for(auto p:factorize(x[i])){
if(p.first<RT) acc[p.first][i+1]+=p.second;
else v[i].emplace_back(p);
}
}
for(Int j=0;j<RT;j++)
for(Int i=0;i<n;i++)
acc[j][i+1]+=acc[j][i];
const Int MAX = 5e5+100;
vector<Int> cnt(MAX,0);
auto expand=[&](Int idx){
for(auto p:v[idx]){
cnt[p.first]+=p.second;
}
};
auto shrink=[&](Int idx){
for(auto p:v[idx]){
cnt[p.first]-=p.second;
}
};
Mo mo(n,400,expand,shrink);
Int q;
cin>>q;
vector<Int> ps(q);
for(Int i=0;i<q;i++){
Int l,r;
cin>>ps[i]>>l>>r;
l--;
mo.add(l,r);
}
mo.build();
vector<ll> ans(q,1);
for(Int i=0;i<q;i++){
Int k=mo.process();
Int l=mo.ls[k],r=mo.rs[k];
if((acc[0][r]-acc[0][l])>=1){
ans[k]=1;
continue;
}
auto mp=factorize(ps[k]);
for(auto p:mp){
if(p.first<RT) ans[k]&=(acc[p.first][r]-acc[p.first][l])>=p.second;
else ans[k]&=cnt[p.first]>=p.second;
}
}
for(Int i=0;i<q;i++) cout<<(ans[i]?"Yes":"NO")<<"\n";
cout<<flush;
return 0;
}
/*
verified on 2018/02/02
https://beta.atcoder.jp/contests/dwacon2017-honsen/tasks/dwango2017final_b
*/
signed main(){
DWANGO2017FINAL_B();
//ABC133_F();
return 0;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0