QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#444329#8523. Puzzle IIucup-team3510#WA 3ms16404kbC++202.7kb2024-06-15 18:21:392024-06-15 18:21:40

Judging History

This is the latest submission verdict.

  • [2024-06-15 18:21:40]
  • Judged
  • Verdict: WA
  • Time: 3ms
  • Memory: 16404kb
  • [2024-06-15 18:21:39]
  • Submitted

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]);
}

详细

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]