結果
問題 | No.2002 Range Swap Query |
ユーザー | SSRS |
提出日時 | 2022-07-08 21:40:03 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 1,361 ms / 2,000 ms |
コード長 | 5,953 bytes |
コンパイル時間 | 1,993 ms |
コンパイル使用メモリ | 178,820 KB |
実行使用メモリ | 14,432 KB |
最終ジャッジ日時 | 2024-06-10 07:32:09 |
合計ジャッジ時間 | 11,846 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 1 ms
6,812 KB |
testcase_01 | AC | 1 ms
6,940 KB |
testcase_02 | AC | 1 ms
6,940 KB |
testcase_03 | AC | 1 ms
6,944 KB |
testcase_04 | AC | 1 ms
6,944 KB |
testcase_05 | AC | 2 ms
6,944 KB |
testcase_06 | AC | 2 ms
6,940 KB |
testcase_07 | AC | 2 ms
6,944 KB |
testcase_08 | AC | 8 ms
6,940 KB |
testcase_09 | AC | 5 ms
6,944 KB |
testcase_10 | AC | 2 ms
6,940 KB |
testcase_11 | AC | 8 ms
6,940 KB |
testcase_12 | AC | 1,361 ms
14,432 KB |
testcase_13 | AC | 1,333 ms
14,432 KB |
testcase_14 | AC | 1,340 ms
14,428 KB |
testcase_15 | AC | 1,246 ms
14,144 KB |
testcase_16 | AC | 123 ms
14,432 KB |
testcase_17 | AC | 678 ms
14,428 KB |
testcase_18 | AC | 329 ms
9,956 KB |
testcase_19 | AC | 632 ms
11,356 KB |
testcase_20 | AC | 114 ms
12,860 KB |
testcase_21 | AC | 96 ms
9,728 KB |
ソースコード
//https://judge.u-aizu.ac.jp/onlinejudge/review.jsp?rid=4001213 //beetさんありがとう #define PROBLEM "http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=0425" #include<bits/stdc++.h> using namespace std; #define call_from_test #ifndef call_from_test #include<bits/stdc++.h> using namespace std; using Int = long long; #endif //BEGIN CUT HERE struct FastIO{ FastIO(){ cin.tie(0); ios::sync_with_stdio(0); } }fastio_beet; //END CUT HERE #ifndef call_from_test signed main(){ return 0; } #endif #ifndef call_from_test #include<bits/stdc++.h> using namespace std; #endif //BEGIN CUT HERE struct Mo{ using F = function<void(int)>; vector<int> ls,rs,ord; int n,width,nl,nr,ptr; F expandL,expandR; F shrinkL,shrinkR; Mo(int n,int width,F expandL,F expandR,F shrinkL,F shrinkR): n(n),width(width),nl(0),nr(0),ptr(0), expandL(expandL),expandR(expandR), shrinkL(shrinkL),shrinkR(shrinkR){} Mo(int n,int width,F expand,F shrink){ *this=Mo(n,width,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]) expandL(--nl); while(nr<rs[idx]) expandR(nr++); while(nl<ls[idx]) shrinkL(nl++); while(nr>rs[idx]) shrinkR(--nr); return idx; } }; //END CUT HERE #ifndef call_from_test #define call_from_test #include "../math/factorize.cpp" #include "../tools/fastio.cpp" #include "../tools/vec.cpp" #include "../tree/eulertourforedge.cpp" #undef call_from_test //INSERT ABOVE HERE signed DWANGO2017FINAL_B(){ using ll = long long; int n,q; cin>>n>>q; 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<int>(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]; ll res=1; const ll MOD = 1e9+7; const int MAX = 5e5+100; vector<int> cnt(MAX,0); vector<ll> fact(MAX),invs(MAX); fact[0]=1; for(int i=1;i<MAX;i++) fact[i]=(fact[i-1]*i)%MOD; invs[1]=1; for(int i=2;i<MAX;i++) invs[i]=invs[MOD%i]*(MOD-MOD/i)%MOD; auto expand=[&](int idx){ for(auto p:v[idx]){ res*=invs[cnt[p.first]+1]; res%=MOD; cnt[p.first]+=p.second; res*=cnt[p.first]+1; res%=MOD; } }; auto shrink=[&](int idx){ for(auto p:v[idx]){ res*=invs[cnt[p.first]+1]; res%=MOD; cnt[p.first]-=p.second; res*=cnt[p.first]+1; res%=MOD; } }; Mo mo(n,400,expand,shrink); for(int i=0;i<q;i++){ int l,r; cin>>l>>r; l--; mo.add(l,r); } mo.build(); vector<ll> ans(q); for(int i=0;i<q;i++){ int k=mo.process(); ans[k]=res; int l=mo.ls[k],r=mo.rs[k]; for(int j=0;j<RT;j++){ ans[k]*=acc[j][r]-acc[j][l]+1; ans[k]%=MOD; } } for(int i=0;i<q;i++) cout<<ans[i]<<"\n"; cout<<flush; return 0; } /* verified on 2019/11/12 https://atcoder.jp/contests/dwacon2017-honsen/tasks/dwango2017final_b */ signed ABC133_F(){ int n,q; cin>>n>>q; vector<int> as(n),bs(n),cs(n),ds(n); vector<int> xs(q),ys(q),us(q),vs(q); EulerTourForEdge et(n); for(int i=1;i<n;i++){ cin>>as[i]>>bs[i]>>cs[i]>>ds[i]; as[i]--;bs[i]--; et.add_edge(as[i],bs[i]); } et.build(); vector<int> idx(n,0); for(int i=1;i<n;i++) idx[et.child(as[i],bs[i])]=i; for(int i=0;i<q;i++){ cin>>xs[i]>>ys[i]>>us[i]>>vs[i]; us[i]--;vs[i]--; } int all=0; vector<int> cnt(n),sum(n),app(n,0); auto exec= [&](int k){ int v=et.bottom(k); int e=idx[v]; app[v]^=1; if(app[v]){ all+=ds[e]; cnt[cs[e]]++; sum[cs[e]]+=ds[e]; }else{ all-=ds[e]; cnt[cs[e]]--; sum[cs[e]]-=ds[e]; } }; Mo mo(n*2,400,exec,exec); for(int i=0;i<q;i++){ auto f=[&](int l,int r){mo.add(min(l,r),max(l,r));}; et.query(us[i],vs[i],f); } mo.build(); vector<int> ans(q,0); for(int i=0;i<q;i++){ int k=mo.process(); ans[k]=all-sum[xs[k]]+cnt[xs[k]]*ys[k]; } for(int i=0;i<q;i++) cout<<ans[i]<<"\n"; cout<<flush; return 0; } /* verified on 2019/11/12 https://atcoder.jp/contests/abc133/tasks/abc133_f */ signed main(){ //DWANGO2017FINAL_B(); //ABC133_F(); return 0; } #endif #undef call_from_test signed main(){ int n,k,q; cin>>n>>k>>q; vector<int> as(k),bs(k); for(int i=0;i<k;i++) cin>>as[i]>>bs[i],as[i]--,bs[i]--; vector<int> ord(n),pos(n); iota(ord.begin(),ord.end(),0); iota(pos.begin(),pos.end(),0); auto moveL= [&](int i){ int x=pos[as[i]],y=pos[bs[i]]; swap(ord[x],ord[y]); swap(pos[ord[x]],pos[ord[y]]); }; auto moveR= [&](int i){ int x=as[i],y=bs[i]; swap(ord[x],ord[y]); swap(pos[ord[x]],pos[ord[y]]); }; Mo mo(q,400,moveL,moveR,moveL,moveR); vector<int> qs(q),ls(q),rs(q),xs(q); for(int i=0;i<q;i++){ qs[i] = 1; cin>>ls[i]>>rs[i]>>xs[i]; ls[i]--;xs[i]--; mo.add(ls[i],rs[i]); } mo.build(); vector<int> ans(q,-1); for(int i=0;i<q;i++){ int p=mo.process(); if(qs[p]==1) ans[p]=ord[xs[p]]+1; if(qs[p]==2) ans[p]=pos[xs[p]]+1; } for(int a:ans) cout<<a<<"\n"; cout<<flush; return 0; }