結果
| 問題 |
No.2002 Range Swap Query
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2022-07-08 21:40:03 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,553 ms / 2,000 ms |
| コード長 | 5,953 bytes |
| コンパイル時間 | 2,226 ms |
| コンパイル使用メモリ | 179,108 KB |
| 実行使用メモリ | 14,432 KB |
| 最終ジャッジ日時 | 2024-12-31 20:27:18 |
| 合計ジャッジ時間 | 14,298 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 20 |
ソースコード
//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;
}
SSRS