QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#444254#8523. Puzzle IIPhantomThreshold#WA 0ms7636kbC++144.8kb2024-06-15 17:58:362024-06-15 17:58:37

Judging History

This is the latest submission verdict.

  • [2024-06-15 17:58:37]
  • Judged
  • Verdict: WA
  • Time: 0ms
  • Memory: 7636kb
  • [2024-06-15 17:58:36]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;

const int maxn=300000;

int n,orik;
int k;
bool flag=0;
string strA,strB;
vector<pair<int,int>> ans;



struct osc{
	int pre;
	int nxt;
	int now;
	int col;		
};
int ca[maxn+50];
int cb[maxn+50];

void check(vector<pair<int,int>> &ANS){
	int sz=ANS.size();
	assert(0<=sz && sz<=n);
	for (auto [x,y]:ANS){
		int i=x;
		int j=y;
		for (int cc=0;cc<orik;cc++){
			swap(ca[i],cb[j]);
			i=i%n+1;
			j=j%n+1;
		}
		cerr << "-----------" << endl;
		for (int i=1;i<=n;i++) cerr << "BC"[ca[i]];
		cerr << endl;
		for (int i=1;i<=n;i++) cerr << "BC"[cb[i]];
		cerr << endl;
	}
	int sum=0;
	for (int i=1;i<=n;i++) sum+=ca[i];
	assert(sum==0 || sum==n);
}

int col[maxn+50];

osc p[maxn+maxn+50];


pair<int,int> gonext(pair<int,int> A){
	if (A.first<=n){
		A.first++;
		if (A.first==n+1) A.first=1;	
	}
	else{
		A.first++;
		if (A.first==n+n+1) A.first=n+1;
	}
	A.second=p[A.second].nxt;
	return A;
}
pair<int,int> gopre(pair<int,int> A){
	if (A.first<=n){
		A.first--;
		if (A.first==0) A.first=n;	
	}
	else{
		A.first--;
		if (A.first==n) A.first=n+n;
	}
	A.second=p[A.second].pre;
	return A;
}

int add(int x,int t){
	int tmp=0;
	if (x>n) x-=n,tmp+=n;
	x=x+t;
	if (x>n) x-=n;
	return tmp+x;	
}
int sub(int x,int t){
	int tmp=0;
	if (x>n) x-=n,tmp+=n;
	x=x-t;
	if (x<=0) x+=n;
	return tmp+x;
}

void solve(){
	{
		int sum=0;
		for (int i=1;i<=n;i++){
			col[i]=ca[i];
			col[i+n]=cb[i];
			sum+=ca[i];
		}
		if (sum==0 || sum==n) return;
	}
	for (int i=1;i<=n;i++){
		if (i!=1) p[i].pre=i-1;
		else p[i].pre=n;
		p[i].now=i;
		p[i].nxt=i%n+1;
		p[i].col=col[p[i].now];
	}
	for (int i=1;i<=n;i++){
		if (i!=1) p[i+n].pre=i-1+n;
		else p[i+n].pre=n+n;
		p[i+n].now=i+n;
		p[i+n].nxt=i%n+1+n;
		p[i+n].col=col[p[i+n].now];
	}
	pair<int,int> posa=make_pair(1,1);
	pair<int,int> posb=make_pair(n+1,n+1);
	{
		for (;p[posa.second].col!=0;) posa=gonext(posa);
		for (;p[posb.second].col!=1;) posb=gonext(posb);
		pair<int,int> ka=posa;
		pair<int,int> kb=posb;
		for (int i=1;i<k;i++) ka=gonext(ka);
		for (int i=1;i<k;i++) kb=gonext(kb);
		
		for (int i=1;i<=n-k-1;i++){
			{
				int cnt=0;
				do{
					cnt++;
					posa=gonext(posa);
					ka=gonext(ka);
				}while (cnt<n && p[posa.second].col==0);
				if (cnt==n) break;
			}
			{
				int cnt=0;
				do{
					cnt++;
					posb=gonext(posb);
					kb=gonext(kb);
				}while (cnt<n && p[posb.second].col==1);
				if (cnt==n) break;
			}
			ans.emplace_back(posa.first,posb.first-n);
			int pre_a=p[posa.second].pre;
			int pre_b=p[posb.second].pre;
			int nxt_a=p[ka.second].nxt;
			int nxt_b=p[kb.second].nxt;
			swap(p[pre_a].nxt,p[pre_b].nxt);
			swap(p[posa.second].pre,p[posb.second].pre);
			swap(p[nxt_a].pre,p[nxt_b].pre);
			swap(p[ka.second].nxt,p[kb.second].nxt);
			swap(posa.second,posb.second);
			swap(ka.second,kb.second);
		}
		vector<int> nowcol(maxn+maxn+5);
		{
			pair<int,int> tmp=posa;
			for (int cc=0;cc<n;cc++){
				nowcol[tmp.first]=p[tmp.second].col;
				tmp=gonext(tmp);
			}
		}
		{
			pair<int,int> tmp=posb;
			for (int cc=0;cc<n;cc++){
				nowcol[tmp.first]=p[tmp.second].col;
				tmp=gonext(tmp);
			}
		}
		{
			int sum=0;
			for (int i=1;i<=n;i++) sum+=nowcol[i];
			if (sum==0 || sum==n) return;
		}
		{
			pair<int,int> sa=posa;
			pair<int,int> sb=posb;
			int sum=0;
			for (int i=1;i<=k;i++){
				sa=gonext(sa);
				if (nowcol[sa.first]==1) sum++;	
			}
			if (sum+sum>k){
				sa=posa;
				sb=posb;
				for (int i=1;i<=k;i++){
					sa=gonext(sa);
					sb=gonext(sb);
					ans.emplace_back(sa.first,sb.first);
					swap(nowcol[sa.first],nowcol[sb.first]);
				}
				sum=k-sum;
			}
			sa=posa;
			for (int i=1;i<=k;i++) sa=gonext(sa);
			sb=gonext(posb);
			for (;sum--;){
				for (;nowcol[sa.first]==0;) sa=gopre(sa);
				for (;nowcol[sb.first]==1;) sb=gonext(sb);
				ans.emplace_back(sa.first,sub(sb.first,k));
				ans.emplace_back(sa.first,sub(sb.first,k-1));
				swap(nowcol[sa.first],nowcol[sb.first]);
			}
		}
	}
}

int main(){
	cin >> n >> orik;
	cin >> strA >> strB;
	for (int i=1;i<=n;i++) if (strA[i-1]=='C') ca[i]=1;
	for (int i=1;i<=n;i++) if (strB[i-1]=='C') cb[i]=1;
	
	if (orik<=n/2){
		k=orik;
	}
	else{
		k=n-orik;
		flag=1;
	}
	solve();
	
	if (flag){
		int sta=1;
		int stb=1;
		int rev=0;
		for (auto &[x,y]:ans){
			int tx=x;
			int ty=y;
			x=add(add(sta,tx),k-1);
			y=add(add(stb,ty),k-1);
			swap(sta,stb);
			if (rev==1) swap(x,y);
			sta=sub(add(sta,ty),tx);
			stb=sub(add(stb,tx),ty);
		//	cerr << "sta,stb : " << sta << " " << stb << endl;
			rev^=1;
		}
	}
	cout << (int)ans.size() << "\n";
	for (auto [x,y]:ans){
		cout << x << " " << y << "\n";	
	}
	
//	check(ans);
	
	return 0;
}

详细

Test #1:

score: 100
Accepted
time: 0ms
memory: 7540kb

input:

6 3
BCCBCC
BBCBBC

output:

2
2 4
4 6

result:

ok moves = 2

Test #2:

score: -100
Wrong Answer
time: 0ms
memory: 7636kb

input:

2 1
BC
BC

output:

1
2 3

result:

wrong answer Integer 3 violates the range [1, 2]