結果
問題 | No.854 公平なりんご分配 |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
#include<bits/stdc++.h>using namespace std;using Int = long long;//BEGIN CUT HEREstruct 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 HEREtemplate<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>::typefill_v(T &t,const V &v){t=v;}template<typename T,typename V>typename enable_if<is_class<T>::value!=0>::typefill_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 vtemplate<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 HEREsigned 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/02https://beta.atcoder.jp/contests/dwacon2017-honsen/tasks/dwango2017final_b*/signed main(){DWANGO2017FINAL_B();//ABC133_F();return 0;}