QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#444328 | #8523. Puzzle II | ucup-team3510# | WA | 0ms | 13136kb | C++20 | 2.7kb | 2024-06-15 18:20:59 | 2024-06-15 18:21:01 |
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: 0
Wrong Answer
time: 0ms
memory: 13136kb
input:
6 3 BCCBCC BBCBBC
output:
op(3,4) op(3,5) op(6,2) op(6,3) 4 4 3 5 3 2 6 3 6
result:
wrong output format Expected integer, but "op(3,4)" found