QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#378008 | #8523. Puzzle II | Days_of_Future_Past# | WA | 0ms | 3836kb | C++23 | 3.2kb | 2024-04-05 22:20:01 | 2024-04-05 22:20:03 |
Judging History
answer
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
#include <bits/stdc++.h>
#define rep(i,n) for(int i=1;i<=n;++i)
#define pb push_back
#define mp make_pair
#define N 310000
#define inf 1000000007
using namespace std;
struct node
{
int l,r; //son
int cnt; //size
int key; //randomkey
int sum[2]; //count
int num; //0 or 1
}a[2*N];
int root;
void update(int x)
{
int l=a[x].l,r=a[x].r;
a[x].cnt=a[l].cnt+a[r].cnt+1;
a[x].sum[0]=a[l].sum[0]+a[r].sum[0];
a[x].sum[1]=a[l].sum[1]+a[r].sum[1];
a[x].sum[a[x].num]++;
}
int merge(int x,int y)
{
if (x==0||y==0)return x+y;
if (a[x].key>a[y].key)
{
a[x].r=merge(a[x].r,y);
update(x);
return x;
}
else
{
a[y].l=merge(x,a[y].l);
update(y);
return y;
}
}
void split(int t,int k,int &x,int &y)
{
if (t==0){x=0; y=0; return;}
if (a[a[t].l].cnt+1<=k)
{
x=t;
split(a[t].r,k-a[a[t].l].cnt-1,a[t].r,y);
}
else
{
y=t;
split(a[t].l,k,x,a[t].l);
}
if (x!=0)update(x);
if (y!=0)update(y);
}
int find(int t,int x)
{
if (a[t].sum[x]==0)return -1;
if (a[t].num==x)return a[a[t].l].cnt+1;
if (a[a[t].l].sum[x]!=0)return find(a[t].l,x);
else return a[a[t].l].cnt+1+find(a[t].r,x);
}
int tot=0;
int newnode(char c)
{
tot++;
a[tot].l=a[tot].r=0;
a[tot].cnt=1;
a[tot].key=rand()*rand();
a[tot].sum[0]=a[tot].sum[1]=0;
if (c=='B')a[tot].num=0; else a[tot].num=1;
a[tot].sum[a[tot].num]++;
return tot;
}
void print(int t)
{
if (t==0)return;
print(a[t].l);
if (a[t].num==0)putchar('B'); else putchar('C');
print(a[t].r);
}
int n,k;
char s1[N],s2[N];
int main()
{
srand(time(0));
cin>>n>>k;
scanf("%s%s",s1+1,s2+1);
//always swap B from s1 to s2
int flag=0;
int b=0,c=0;
rep(i,n)if (s1[i]=='B')b++; else c++;
if (b>c){ flag=1; swap(s1,s2); }
cout<<2*min(b,c)<<endl;
//init treap
int root1=0,root2=0;
rep(i,n)root1=merge(root1,newnode(s1[i]));
rep(i,n)root2=merge(root2,newnode(s2[i]));
while (1)
{
//print(root1); puts("");
//print(root2); puts("");
//find any B and C
int x=find(root1,0);
int y=find(root2,1);
//cout<<x<<" "<<y<<endl;
if (x==-1 || y==-1)break;
//print
if (flag==0)
{
if (y>k)printf("%d %d\n",x,y-k); else printf("%d %d\n",x,n-(k-y));
if (y>=k)printf("%d %d\n",x,y-k+1); else printf("%d %d\n",x,n-(k-y)+1);
}
else
{
if (y>k)printf("%d %d\n",y-k,x); else printf("%d %d\n",n-(k-y),x);
if (y>=k)printf("%d %d\n",y-k+1,x); else printf("%d %d\n",n-(k-y)+1,x);
}
//update treap
int p1,xx,p3; split(root1,x,xx,p3); split(xx,x-1,p1,xx); root1=merge(p1,p3);
int q1,yy,q3; split(root2,y,yy,q3); split(yy,y-1,q1,yy); root2=merge(q1,q3);
int nxtx=x+k; if (nxtx>n)nxtx-=n; split(root1,nxtx-1,p1,p3); root1=merge(merge(p1,yy),p3);
int nxty=y-k; if (nxty<0)nxty+=n; split(root2,nxty-1,q1,q3); root2=merge(merge(q1,xx),q3);
}
return 0;
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 3836kb
input:
6 3 BCCBCC BBCBBC
output:
4 4 6 4 1 2 3 2 4
result:
wrong answer The final sequences are not correct!