QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#444254 | #8523. Puzzle II | PhantomThreshold# | WA | 0ms | 7636kb | C++14 | 4.8kb | 2024-06-15 17:58:36 | 2024-06-15 17:58:37 |
Judging History
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;
}
Details
Tip: Click on the bar to expand more detailed information
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]