社区讨论
80pts求调(WAon#1#2,玄关)
P10392[蓝桥杯 2024 省 A] 封印宝石参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mhj20gal
- 此快照首次捕获于
- 2025/11/03 19:25 4 个月前
- 此快照最后确认于
- 2025/11/03 19:25 4 个月前
CPP
#include<iostream>
#include<utility>
#include<map>
#include<algorithm>
using namespace std;
const int maxn=100005;
struct gem
{
int v,x;
friend bool operator < (gem a,gem b)
{
if(a.v==b.v)
{
return a.x>b.x;
}
return a.v<b.v;
}
friend bool operator > (gem a,gem b)
{
if(a.v==b.v)
{
return a.x<b.x;
}
return a.v>b.v;
}
friend bool operator == (gem a,gem b)
{
return a.v==b.v&&a.x==b.x;
}
};
gem tr[maxn<<2];
gem tr1[maxn<<2];
int a[maxn];
void push_up(int id)
{
tr[id]=max(tr[id*2],tr[id*2+1]);
if(tr[id*2]==tr[id*2+1]&&tr[id*2]==tr1[id*2]&&tr[id*2+1]==tr1[id*2+1])
{
tr1[id]={0,0};
return ;
}
gem t[]={tr[id*2],tr[id*2+1],tr1[id*2],tr1[id*2+1]};
for(int i=0;i<4;i++)
{
if(t[i]>tr1[id]&&t[i]<tr[id])
{
tr1[id]=t[i];
}
}
}
void build(int id,int l,int r)
{
if(l==r)
{
tr[id]={a[l],l};
tr1[id]={a[l],0};
return ;
}
int mid=(l+r)>>1;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
push_up(id);
}
gem find(int id,int l,int r,int x,int y)
{
if(x<=l&&r<=y)
{
return tr[id];
}
int mid=(l+r)>>1;
if(y<=mid)
{
return find(id*2,l,mid,x,y);
}
else if(x>mid)
{
return find(id*2+1,mid+1,r,x,y);
}
else
{
return max(find(id*2,l,mid,x,y),find(id*2+1,mid+1,r,x,y));
}
}
gem find_1(int id,int l,int r,int x,int y)
{
// cout << l << ' ' << r << '\n';
if(x<=l&&r<=y)
{
return tr1[id];
}
int mid=(l+r)>>1;
if(y<=mid)
{
return find_1(id*2,l,mid,x,y);
}
else if(x>mid)
{
return find_1(id*2+1,mid+1,r,x,y);
}
else
{
gem a=find(id*2,l,mid,x,y),b=find(id*2+1,mid+1,r,x,y);
gem maxx=max(a,b);
gem c=find_1(id*2,l,mid,x,y),d=find_1(id*2+1,mid+1,r,x,y);
if(a==b&&b==c&&c==d)
{
return {0,0};
}
gem t[]={a,b,c,d};
gem ret={0,0};
for(int i=0;i<4;i++)
{
if(t[i]>ret&&t[i]<maxx)
{
ret=t[i];
}
}
return ret;
}
}
void erase(int id,int l,int r,int x)
{
// cout << l << ' ' << r << '\n';
if(l==r&&r==x)
{
tr[id].v=tr[id].x=0;
return ;
}
int mid=(l+r)>>1;
if(x<=mid)
{
erase(id*2,l,mid,x);
}
else
{
erase(id*2+1,mid+1,r,x);
}
push_up(id);
}
int ans[maxn];
int main()
{
int n,k;
cin >> n >> k;
for(int i=1;i<=n;i++)
{
cin >> a[i];
ans[i]=-1;
}
build(1,1,n);
for(int i=1;i<=n;i++)
{
// cout << i << '\n';
gem t=find(1,1,n,i,min(i+k,n));
if(ans[i-1]==t.v)
{
t=find_1(1,1,n,i,min(i+k,n));
}
if(t.x==0)
{
continue;
}
ans[i]=t.v;
k-=(t.x-i);
erase(1,1,n,t.x);
}
for(int i=1;i<=n;i++)
{
cout << ans[i] << ' ';
}
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...