結果
| 問題 |
No.1558 Derby Live
|
| コンテスト | |
| ユーザー |
tpc011854
|
| 提出日時 | 2021-06-26 00:18:51 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 129 ms / 2,000 ms |
| コード長 | 1,993 bytes |
| コンパイル時間 | 486 ms |
| コンパイル使用メモリ | 35,968 KB |
| 実行使用メモリ | 24,364 KB |
| 最終ジャッジ日時 | 2024-06-25 09:00:33 |
| 合計ジャッジ時間 | 6,084 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 33 |
ソースコード
#include <cstdio>
struct SegT {
int l,r;
int d[25];
SegT(){
for(int i = 1; i <= 20; i++) d[i] = i;
}
};
SegT t[200005];
int len = -1;
void build(int p,int l,int r){
t[p].l = l, t[p].r = r;
if(l==r){
return ;
}
else{
int m = (l+r)/2;
build(2*p, l, m);
build(2*p+1, m+1, r);
}
}
SegT merge(const SegT& u, const SegT& v){
SegT res;
res.l = u.l, res.r = v.r;
for(int i = 1; i <= len; i++) res.d[i] = u.d[v.d[i]];
return res;
}
void change(int p, int x, int d[]){
if(t[p].l == t[p].r){
for(int i = 1; i <= len; i++) t[p].d[i] = d[i];
}
else{
int m = (t[p].l+t[p].r)/2;
if(x<=m) change(2*p, x, d);
else change(2*p+1,x,d);
t[p] = merge(t[2*p],t[2*p+1]);
}
}
SegT ask(int p,int l,int r){
if(l<=t[p].l && r>=t[p].r) return t[p];
else{
int m = (t[p].l+t[p].r)/2;
if(r<=m) return ask(2*p, l, r);
else if(l>=m+1) return ask(2*p+1, l, r);
else return merge(ask(2*p,l,r), ask(2*p+1,l,r));
}
}
void inv(int d[]){
int dd[25];
for(int i = 1; i <= len; i++){
dd[d[i]] = i;
}
for(int i = 1; i <= len; i++) d[i] = dd[i];
}
int main(){
int n,m,q;
scanf("%d%d%d",&n,&m,&q);
len = n;
build(1,1,m);
//printf("done\n");
for(int rnd = 0; rnd < q; rnd++){
int order;
scanf("%d",&order);
if(order==1){
int p[25];
int u;
scanf("%d",&u);
for(int i = 1; i <= n; i++) scanf("%d",&p[i]);
inv(p);
change(1,u,p);
}
else if(order==2){
int u;
scanf("%d",&u);
SegT res = ask(1,1,u);
for(int i = 1; i <= n; i++) printf("%d ",res.d[i]);
printf("\n");
}
else{
int u,v;
scanf("%d%d",&u,&v);
u--;
SegT resU;
if(u!=0)
resU = ask(1,1,u);
else
for(int i = 1; i <= len; i++) resU.d[i] = i;
SegT resV = ask(1,1,v);
int rankU[25], rankV[25];
for(int i = 1; i <= n; i++) rankU[resU.d[i]] = i, rankV[resV.d[i]] = i;
int res = 0;
for(int i = 1; i <= n; i++){
int add = rankV[resU.d[i]] - i;
if(add < 0) add *= -1;
res += add;
}
printf("%d\n",res);
}
}
return 0;
}
tpc011854