QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#718502 | #8523. Puzzle II | yhddd | WA | 3ms | 20248kb | C++14 | 3.6kb | 2024-11-06 20:41:46 | 2024-11-06 20:41:46 |
Judging History
answer
#include<bits/stdc++.h>
#define int long long
#define mod 998244353ll
#define pii pair<int,int>
#define fi first
#define se second
#define mems(x,y) memset(x,y,sizeof(x))
#define pb push_back
#define db double
using namespace std;
const int maxn=300010;
const int inf=1e18;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch-48);ch=getchar();}
return x*f;
}
bool Mbe;
int n,k;
char s[maxn],t[maxn];
mt19937 rnd(time(0));
struct fhq{
int w[maxn<<1],ls[maxn<<1],rs[maxn<<1],idx,rt;
int siz[maxn<<1],sz[maxn<<1],num[maxn<<1],val[maxn<<1];
void up(int u){
siz[u]=siz[ls[u]]+siz[rs[u]]+sz[u];
num[u]=num[ls[u]]+num[rs[u]]+val[u];
}
int merge(int u,int v){
if(!u||!v)return u|v;
if(w[u]<w[v]){
rs[u]=merge(rs[u],v);
up(u);
return u;
}
else{
ls[v]=merge(u,ls[v]);
up(v);
return v;
}
}
pii split1(int u,int k){
if(!u)return {0,0};
if(siz[ls[u]]+sz[u]>k){
pii t=split1(ls[u],k);
ls[u]=t.se;
up(u);
return {t.fi,u};
}
else{
pii t=split1(rs[u],k-siz[ls[u]]-sz[u]);
rs[u]=t.fi;
up(u);
return {u,t.se};
}
}
pii split2(int u,int k){
if(!u)return {0,0};
if(num[ls[u]]+val[u]>k){
pii t=split2(ls[u],k);
ls[u]=t.se;
up(u);
return {t.fi,u};
}
else{
pii t=split2(rs[u],k-num[ls[u]]-val[u]);
rs[u]=t.fi;
up(u);
return {u,t.se};
}
}
int newnode(int s,int v){
w[++idx]=rnd();siz[idx]=sz[idx]=s,val[idx]=num[idx]=v;
return idx;
}
}t1,t2;
vector<pii> ans;
void work(){
n=read();k=read();
scanf("%s%s",s+1,t+1);
int num=0;
for(int i=1;i<=n;i++)num+=s[i]=='B';
if(num<n/2){
for(int i=1;i<=n;i++)s[i]=s[i]=='B'?'C':'B';
for(int i=1;i<=n;i++)t[i]=t[i]=='B'?'C':'B';
}
for(int i=1;i<=n;i++){
t1.rt=t1.merge(t1.rt,t1.newnode(1,s[i]=='C'));
t2.rt=t2.merge(t2.rt,t2.newnode(1,t[i]=='B'));
}
// cout<<t1.rt<<" "<<t1.num[t1.rt]<<"\n";
while(t1.num[t1.rt]){
int a1=0,b1=0,c1=0,d1=0,e1=0,f1=0,a2=0,b2=0,c2=0,d2=0,e2=0,f2=0;
pii res=t1.split2(t1.rt,0);
e1=res.fi,a1=res.se;
int p1=t1.siz[e1]+1;
res=t1.split1(a1,1);
a1=res.fi,b1=res.se;
if(t1.siz[b1]>=k){
res=t1.split1(b1,k-1);
b1=res.fi,f1=res.se;
}
else{
res=t1.split1(e1,k-1-t1.siz[b1]);
c1=res.fi,e1=res.se;
res=t1.split1(c1,1);
c1=res.fi,d1=res.se;
}
res=t2.split2(t2.rt,0);
b2=res.fi,a2=res.se;
int p2=t2.siz[b2]+1;
res=t2.split1(a2,1);
a2=res.fi,e2=res.se;
if(t2.siz[b2]>k){
res=t1.split1(b2,t2.siz[b2]-k);
f2=res.fi,b2=res.se;
}
else{
res=t2.split1(e2,t2.siz[e2]-(k-t2.siz[b2]));
e2=res.fi,c2=res.se;
res=t2.split1(c2,t2.siz[c2]-1);
d2=res.fi,c2=res.se;
}
// cout<<p1<<" "<<p2<<"\n";
int g1=t1.newnode(1,0),g2=t2.newnode(1,0);
if(f1){
t1.rt=t1.merge(e1,t1.merge(b1,t1.merge(g1,f1)));
}
else{
t1.rt=t1.merge(d1,t1.merge(g1,t1.merge(e1,t2.merge(b1,c1))));
}
if(f2){
t2.rt=t2.merge(f2,t2.merge(g2,t2.merge(b2,e2)));
}
else{
t2.rt=t2.merge(c2,t2.merge(b2,t2.merge(e2,t2.merge(g2,d2))));
}
ans.pb({p1,p2});
}
printf("%lld\n",ans.size()*2);
for(auto[l,r]:ans){
int p1=l,p2=r-k;if(p2<=0)p2+=n;
printf("%lld %lld\n",p1,p2);
p2++;if(p2>n)p2-=n;
printf("%lld %lld\n",p1,p2);
}
}
// \
444
bool Med;
int T;
signed main(){
// freopen(".in","r",stdin);
// freopen(".out","w",stdout);
// ios::sync_with_stdio(0);
// cin.tie(0);cout.tie(0);
// cerr<<(&Mbe-&Med)/1048576.0<<" MB\n";
T=1;
while(T--)work();
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 18344kb
input:
6 3 BCCBCC BBCBBC
output:
4 1 6 1 1 4 4 4 5
result:
ok moves = 4
Test #2:
score: 0
Accepted
time: 0ms
memory: 18360kb
input:
2 1 BC BC
output:
2 2 2 2 1
result:
ok moves = 2
Test #3:
score: 0
Accepted
time: 0ms
memory: 20248kb
input:
2 1 BB CC
output:
0
result:
ok moves = 0
Test #4:
score: 0
Accepted
time: 0ms
memory: 18368kb
input:
2 1 CC BB
output:
0
result:
ok moves = 0
Test #5:
score: 0
Accepted
time: 3ms
memory: 18400kb
input:
3 1 CCC BBB
output:
0
result:
ok moves = 0
Test #6:
score: -100
Wrong Answer
time: 0ms
memory: 18264kb
input:
3 1 CBC BCB
output:
4 1 3 1 1 3 3 3 1
result:
wrong answer Integer 4 violates the range [0, 3]