一看数据2e5 暴力nlogn走起 直接每个单点更新
代码十分钟,debug两小时,最后发现是没有限制边界导致数组链表形成循环了,r[x>n]=0,r[n]<x,哭辽
TAG rating 1800的沙雕题,熬夜debug这玩意我怀疑我我脑子瓦特了
这可能也是我快一个月没打codeforces的锅吧
#include<bits/stdc++.h>
using namespace std;
int sum[800005],ll[200005],rr[200005],a[200005],b[200005];
void pushup(int rt)
{
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
}
void update(int l,int r,int x,int rt)
{
if(l==r)
{
sum[rt]=0;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
update(l,mid,x,rt<<1);
else
update(mid+1,r,x,rt<<1|1);
pushup(rt);
}
int query(int l,int r,int rt)
{
if(l==r)
return l;
int mid=(l+r)>>1;
if(sum[rt<<1]<sum[rt<<1|1])
return query(mid+1,r,rt<<1|1);
else
return query(l,mid,rt<<1);
}
int main()
{
int n,m,i,j,k,ans,num,l,r,sym;
// while(~scanf("%d%d",&n,&k))
// {
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
ll[i]=i-1;
rr[i]=i+1;
}
build(1,n,1);
sym=1;
while(1)
{
i=query(1,n,1);
a[i]=0;
b[i]=sym,r=rr[i],l=ll[i];
update(1,n,i,1);
for(j=1;j<=k;j++)
{
if(a[r]==0&&a[l]==0)
break;
if(a[r]!=0)
{
b[r]=sym;
a[r]=0;
update(1,n,r,1);
}
if(a[l]!=0)
{
a[l]=0;
b[l]=sym;
update(1,n,l,1);
}
if(r<=n)
r=rr[r];
if(l>=1)
l=ll[l];
}
if(sym==1)
sym=2;
else
sym=1;
if(a[r]==0&&a[l]==0)
break;
rr[l]=r;
ll[r]=l;
}
for(i=1;i<=n;i++)
printf("%d",b[i]);
printf("\n");
// }
return 0;
}