QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#444329 | #8523. Puzzle II | ucup-team3510# | WA | 3ms | 16404kb | C++20 | 2.7kb | 2024-06-15 18:21:39 | 2024-06-15 18:21:40 |
Judging History
answer
#include <bits/stdc++.h>
#define N 600011
#define any orinvotr
using namespace std;
int n,k;
int lc[N],rc[N],siz[N],any[N][2];char v[N];unsigned R[N];
void pushup(int x)
{
siz[x]=siz[lc[x]]+siz[rc[x]]+1;
for(int o=0;o<2;++o)
{
any[x][o]=0;
if(any[lc[x]][o])any[x][o]=any[lc[x]][o];
else if(v[x]-'B'==o)any[x][o]=siz[lc[x]]+1;
else if(any[rc[x]][o])any[x][o]=any[rc[x]][o]+siz[lc[x]]+1;
}
}
void split(int x,int k,int &a,int &b)
{
if(!x){a=b=0;return;}
if(siz[lc[x]]>=k)b=x,split(lc[x],k,a,lc[x]);
else a=x,split(rc[x],k-siz[lc[x]]-1,rc[x],b);pushup(x);
}
int merge(int a,int b)
{
if(!a||!b)return a^b;
if(R[a]<R[b]){rc[a]=merge(rc[a],b);pushup(a);return a;}
lc[b]=merge(a,lc[b]);pushup(b);return b;
}
int rt1,rt2,sz;
int res[N][2],rn;
void op(int u,int v)
{//printf("op(%d,%d)\n",u,v);
if(u+k-1<=n&&v+k-1<=n)
{
int P,Q,R,S,T,U;
split(rt1,u+k-1,Q,R);split(Q,u-1,P,Q);
split(rt2,v+k-1,T,U);split(T,v-1,S,T);
rt1=merge(P,merge(T,R));
rt2=merge(S,merge(Q,U));
}
else if(u+k-1<=n)
{
int P,Q,R,S,T,U;
split(rt1,u+k-1,Q,R);split(Q,u-1,P,Q);
split(rt2,v-1,T,U);split(T,v+k-1-n,S,T);
rt1=merge(P,merge(U,merge(S,R)));
int Q1,Q2;
split(Q,n-v+1,Q1,Q2);
rt2=merge(Q2,merge(T,Q1));
}
else if(v+k-1<=n)
{
int P,Q,R,S,T,U;
split(rt1,u-1,Q,R);split(Q,u+k-1-n,P,Q);
split(rt2,v+k-1,T,U);split(T,v-1,S,T);
rt2=merge(S,merge(R,merge(P,U)));
int T1,T2;
split(T,n-u+1,T1,T2);
rt1=merge(T2,merge(Q,T1));
}
else
{
int P,Q,R,S,T,U;
split(rt1,u-1,Q,R);split(Q,u+k-1-n,P,Q);
split(rt2,v+k-1,T,U);split(T,v-1,S,T);
int X=merge(R,P);
int X1,X2;
split(X,n-v+1,X1,X2);
rt2=merge(X2,merge(T,X1));
X=merge(U,S);
split(X,n-u+1,X1,X2);
rt1=merge(X2,merge(Q,X1));
}
++rn;res[rn][0]=u;res[rn][1]=v;
}
char s[N],t[N];
mt19937 rnd(801);
int make(char c)
{
++sz;v[sz]=c;
any[sz][c-'B']=1;any[sz][!(c-'B')]=0;
siz[sz]=1;lc[sz]=rc[sz]=0;R[sz]=rnd();
return sz;
}
void dfs(int u)
{
if(!u)return;
dfs(lc[u]);
putchar(v[u]);
dfs(rc[u]);
}
int main()
{
scanf("%d%d%s%s",&n,&k,s+1,t+1);
int cntb=0;
for(int i=1;i<=n;++i)cntb+=s[i]=='B';
bool flg=0;
if(cntb+cntb<n)flg=1,swap(s,t);
for(int i=1;i<=n;++i)rt1=merge(rt1,make(s[i]));
for(int i=1;i<=n;++i)rt2=merge(rt2,make(t[i]));
// printf("s:");dfs(rt1);putchar(10);
// printf("t:");dfs(rt2);putchar(10);
while(any[rt1][1])
{
int idC=any[rt1][1];
int idB=any[rt2][0];
int preB=idB==k?n:(idB-k+n)%n;
op(idC,preB);
op(idC,preB%n+1);
// printf("s:");dfs(rt1);putchar(10);
// printf("t:");dfs(rt2);putchar(10);
}
printf("%d\n",rn);
for(int i=1;i<=rn;++i)printf("%d %d\n",res[i][flg],res[i][!flg]);
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 3ms
memory: 16360kb
input:
6 3 BCCBCC BBCBBC
output:
4 4 3 5 3 2 6 3 6
result:
ok moves = 4
Test #2:
score: 0
Accepted
time: 2ms
memory: 12076kb
input:
2 1 BC BC
output:
2 2 2 2 1
result:
ok moves = 2
Test #3:
score: 0
Accepted
time: 0ms
memory: 12104kb
input:
2 1 BB CC
output:
0
result:
ok moves = 0
Test #4:
score: 0
Accepted
time: 0ms
memory: 16248kb
input:
2 1 CC BB
output:
0
result:
ok moves = 0
Test #5:
score: 0
Accepted
time: 0ms
memory: 13208kb
input:
3 1 CCC BBB
output:
0
result:
ok moves = 0
Test #6:
score: 0
Accepted
time: 3ms
memory: 16404kb
input:
3 1 CBC BCB
output:
2 1 2 2 2
result:
ok moves = 2
Test #7:
score: 0
Accepted
time: 0ms
memory: 12076kb
input:
3 2 BBB CCC
output:
0
result:
ok moves = 0
Test #8:
score: 0
Accepted
time: 0ms
memory: 12104kb
input:
3 2 BCB BCC
output:
2 2 2 2 3
result:
ok moves = 2
Test #9:
score: 0
Accepted
time: 0ms
memory: 13180kb
input:
4 2 CCCB BBCB
output:
2 2 3 3 3
result:
ok moves = 2
Test #10:
score: -100
Wrong Answer
time: 0ms
memory: 13280kb
input:
9 6 CCCBCCCBB BBBCBBBCC
output:
16 7 4 8 4 4 7 5 7 4 1 5 1 6 5 7 5 4 1 5 1 5 3 6 3 4 3 5 3 3 9 4 9
result:
wrong answer Integer 16 violates the range [0, 9]