社区讨论

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 条回复,欢迎继续交流。

正在加载回复...