求hack数据
查看原帖
求hack数据
137242
DiaоsiKreator楼主2023/12/23 20:33

WA on 3,4,5

有没有小规模的能手玩的数据啊,本地跑了几千组没跑出来。。。

#include<bits/stdc++.h>
#define pb(x) push_back(x)
typedef long long ll;
typedef long double ld;
using namespace std;
const int N=200010,M=2000010,INF=0x3f3f3f3f;
inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
inline void swap(int &x,int &y){x^=y^=x^=y;}
int n,a[N],t[N];
vector<int> p[N],add[N],del[N];
set<int> st;
struct SegmentTree{
	int l,r;
	int pos,val,tag;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define pos(x) tree[x].pos
	#define val(x) tree[x].val
	#define tag(x) tree[x].tag
}tree[N<<2];
void pushup(int x){
	pos(x)=min(pos(x<<1),pos(x<<1|1));
	val(x)=min(val(x<<1),val(x<<1|1));
}
void build(int x,int l,int r){
	l(x)=l,r(x)=r;
	pos(x)=val(x)=INF;
	if(l==r){pos(x)=n+1;return;}
	int mid=(l+r)>>1;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	pushup(x);
}
void pushdown(int x){
	if(!tag(x))return;
	pos(x<<1)=tag(x);
	pos(x<<1|1)=tag(x);
	val(x<<1)=tag(x)-r(x<<1)+1;
	val(x<<1|1)=tag(x)-r(x<<1|1)+1;
	tag(x<<1)=tag(x);
	tag(x<<1|1)=tag(x);
	tag(x)=0;
}
void change(int x,int L,int R,int d){
	if(L>R)return;
	int l=l(x),r=r(x);
	if(L<=l&&r<=R){
		pos(x)=tag(x)=d;
		val(x)=d-r+1;
		return;
	}
	int mid=(l+r)>>1;
	pushdown(x);
	if(L<=mid)change(x<<1,L,R,d);
	if(R>mid)change(x<<1|1,L,R,d);
	pushup(x);
}
int ask(int x,int L,int R){
	int l=l(x),r=r(x);
	if(L<=l&&r<=R)return pos(x);
	int mid=(l+r)>>1,val=INF;
	pushdown(x);
	if(L<=mid)val=min(val,ask(x<<1,L,R));
	if(R>mid)val=min(val,ask(x<<1|1,L,R));
	return val;
}
int query(int x,int L,int R){
	int l=l(x),r=r(x);
	if(L<=l&&r<=R)return val(x);
	int mid=(l+r)>>1,val=INF;
	pushdown(x);
	if(L<=mid)val=min(val,query(x<<1,L,R));
	if(R>mid)val=min(val,query(x<<1|1,L,R));
	return val;
}
void out(int x,int l,int r){
	if(l==r){cout<<pos(x)<<" ";return;}
	int mid=(l+r)>>1;
	pushdown(x);
	out(x<<1,l,mid);
	out(x<<1|1,mid+1,r);
}
int main(){
	scanf("%d",&n);
	for(int i=0;i<=n;i++)p[i].pb(0);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		p[a[i]].pb(i);
	}
	for(int i=0;i<=n;i++)p[i].pb(n+1);
	build(1,1,n);
	for(int z:p[0])
		if(z&&z!=n+1)change(1,z,z,z);
	for(int j=0;j<(int)p[0].size()-1;j++){
		int l=p[0][j]+1,r=p[0][j+1]-1,u=1,d=r-l+1;
		if(l>r)continue;
		add[u].pb(0),del[d+1].pb(0);
		for(int k=r;k>=l;k--)
			if(a[k]==1){change(1,k+1,r,r+1);break;}
			else if(k==l)change(1,k,r,r+1);
	}
	//out(1,1,n);puts("");
	for(int i=1;i<=n;i++){
		for(int j=0,lst=1;j<(int)p[i].size()-1;j++){
			int l=p[i][j]+1,r=p[i][j+1]-1;
			if(l>r)continue;
			int ql=l,qr=r,res=0;
			while(ql<=qr){
				int mid=(ql+qr)>>1;
				if(ask(1,mid,mid)<=r)ql=(res=mid)+1;
				else qr=mid-1;
			}
			//cout<<"res: "<<res<<endl;
			int u=query(1,l,res),d=r-l+1,p=ask(1,l,r);
			if(!res){
				if(p!=n+1)lst=r+2;
				continue;
			}
			//printf("%d : [%d,%d]\n",i,u,d);
			add[u].pb(i),del[d+1].pb(i);
			change(1,l,res,r+1);
			change(1,lst,l-1,p);
			lst=res+1;
		}
		//out(1,1,n);puts("");
		if(p[i].size()==2)break;
	}
	for(int i=0;i<=n+2;i++)st.insert(i);
	for(int i=1;i<=n;i++){
		for(int z:add[i])
			!t[z]?st.erase(z),++t[z]:++t[z];
		for(int z:del[i])
			t[z]==1?st.insert(z),--t[z]:--t[z];
		printf("%d ",*st.begin());
	}
	return 0;
}
/*
20
8 20 2 3 12 17 7 16 18 7 18 17 0 1 10 19 7 2 9 19 
*/
2023/12/23 20:33
加载中...