QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#243368#964. Excluded MinlinweitongWA 8ms39052kbC++144.7kb2023-11-08 07:19:522023-11-08 07:19:54

Judging History

你现在查看的是最新测评结果

  • [2023-11-08 07:19:54]
  • 评测
  • 测评结果:WA
  • 用时:8ms
  • 内存:39052kb
  • [2023-11-08 07:19:52]
  • 提交

answer

#include<bits/stdc++.h>
using namespace std;
const int N=500005,inf=1e9;
int n,q,a[N],bz[N],ans[N],mxx,maxx[N],mxid[N];
struct node{int l,r,id;}b[N];
vector<int>v[N];
bool cmp(node x,node y){return x.l==y.l?(x.r>y.r):(x.l<y.l);}
struct BIT{
	int tr[N];
	void add(int x,int v){for (int i=x;i<=n;i+=(i&(-i)))tr[i]+=v;}
	int query(int x){int s=0;for (int i=x;i;i-=(i&(-i)))s+=tr[i];return s;}
	int qry(int l,int r){return query(r)-query(l-1);}
}t1;
struct sgt1{
	int mx[N<<2],id[N<<2],tag[N<<2];
	void pushup(int x){
		if (mx[x<<1]>mx[x<<1|1]){
			mx[x]=mx[x<<1];
			id[x]=id[x<<1];
		}
		else{
			mx[x]=mx[x<<1|1];
			id[x]=id[x<<1|1];
		}
	}
	void pushdown(int x){
		if (tag[x]!=0){
			mx[x<<1]+=tag[x];
			mx[x<<1|1]+=tag[x];
			tag[x<<1]+=tag[x];
			tag[x<<1|1]+=tag[x];
			tag[x]=0;
		}
	}
	void build(int l,int r,int x){
		if (l==r){
			if (bz[l])mx[x]=t1.qry(b[l].l,b[l].r);
			else mx[x]=-inf;
			id[x]=l;
			return;
		}
		int mid=(l+r)>>1;
		build(l,mid,x<<1),build(mid+1,r,x<<1|1);
		pushup(x);
	}
	void modify1(int x,int l,int r,int L,int R,int v){
		if (r<L||l>R)return;
		if (L<=l&&r<=R){mx[x]+=v,tag[x]+=v;return;}
		pushdown(x);
		int mid=(l+r)>>1;
		modify1(x<<1,l,mid,L,R,v),modify1(x<<1|1,mid+1,r,L,R,v);
		pushup(x);
	}
	void modify2(int x,int l,int r,int k,bool ck){
		if (l==r){mx[x]=ck?(-inf):(t1.qry(b[l].l,b[l].r));return;}
		pushdown(x);
		int mid=(l+r)>>1;
		if (k<=mid)modify2(x<<1,l,mid,k,ck);
		else modify2(x<<1|1,mid+1,r,k,ck);
		pushup(x);
	}
}t2;
struct Triple{
	int L,R,id;
};
struct Node{
	int x,id;
	friend bool operator<(Node x,Node y){
		return x.x<y.x;
	}
};
set<Node>e[N]; 
set<Node>s1,s2;
struct sgt2{
	int mx[N<<2],id[N<<2],idd[N<<2];
	void pushup(int x){
		if (mx[x<<1]>mx[x<<1|1]){
			mx[x]=mx[x<<1];
			id[x]=id[x<<1];
			idd[x]=idd[x<<1];
		}
		else if (mx[x<<1]<mx[x<<1|1]){
			mx[x]=mx[x<<1|1];
			id[x]=id[x<<1|1];
			idd[x]=idd[x<<1|1];
		}
		else{
			if (id[x<<1]<id[x<<1|1]){
				mx[x]=mx[x<<1];
				id[x]=id[x<<1];
				idd[x]=idd[x<<1];
			}
			else{
				mx[x]=mx[x<<1|1];
				id[x]=id[x<<1|1];
				idd[x]=idd[x<<1|1];
			}
		}
	}
	void build(int l,int r,int x){
		if (l==r){mx[x]=maxx[l],id[x]=l,idd[x]=mxid[l];return;}
		int mid=(l+r)>>1;
		build(l,mid,x<<1),build(mid+1,r,x<<1|1);
		pushup(x);
	}
	Triple query(int x,int l,int r,int L,int R){
		if (r<L||l>R)return (Triple){0,0,0};
		if (L<=l&&r<=R)return (Triple){id[x],mx[x],idd[x]};
		int mid=(l+r)>>1;
		Triple s1=query(x<<1,l,mid,L,R),s2=query(x<<1|1,mid+1,r,L,R);
		if (s1.R!=s2.R)return s1.R>s2.R?s1:s2;
		return s1;
	}
	void modify(int x,int l,int r,int k){
		if (l==r){
			if (e[l].empty())mx[x]=0,id[x]=0,idd[x]=0;
			else{
				Node u=(*e[l].begin());
				mx[x]=-u.x;
				id[x]=l;
				idd[x]=u.id;
			}
			return;
		}
		int mid=(l+r)>>1;
		if (k<=mid)modify(x<<1,l,mid,k);
		else modify(x<<1|1,mid+1,r,k);
		pushup(x);
	}
}t3; 
int main(){
	scanf("%d%d",&n,&q);
	for (int i=1;i<=n;++i){
		scanf("%d",&a[i]);
		v[a[i]].push_back(i);
		t1.add(i,1);
		mxx=max(mxx,a[i]);
	}
	for (int i=1;i<=q;++i)scanf("%d%d",&b[i].l,&b[i].r),b[i].id=i;
	sort(b+1,b+q+1,cmp);
	for (int i=1;i<=q;++i){
		e[b[i].l].insert((Node){-b[i].r,i}); 
	}
	for (int i=1;i<=n;++i){
		if (!e[i].empty()){
			maxx[i]=-(*e[i].begin()).x;
			mxid[i]=(*e[i].begin()).id;
		}
	}
	t3.build(1,n,1);
	int o=0;
	for (int i=1;i<=q;++i){
		if (b[i].r>o){
			o=b[i].r;
			bz[i]=1;
			s1.insert((Node){-b[i].l,i});
			s2.insert((Node){b[i].r,i});
		}
	}
	t2.build(1,q,1);
	for (int i=mxx+1;i>=0;--i){
		for (int j:v[i]){
			t1.add(j,-1);
			int L,R;
			if (s1.lower_bound((Node){-j,0})!=s1.end())R=(*s1.lower_bound((Node){-j,0})).id;
			else R=-1;
			if (s2.lower_bound((Node){j,0})!=s2.end())L=(*s2.lower_bound((Node){j,0})).id;
			else L=-1;
			if (L!=-1&&R!=-1)t2.modify1(1,1,q,L,R,-1);
		}
		while (t2.mx[1]>=i){
			int x=t2.id[1];
			ans[b[x].id]=i;
			t2.modify2(1,1,q,x,1);
			e[b[x].l].erase((Node){-b[x].r,x});
			t3.modify(1,1,n,b[x].l);
			bz[x]=2;
			int las,nex;
			if (s1.lower_bound((Node){1-b[x].l,0})!=s1.end())las=(*s1.lower_bound((Node){1-b[x].l,0})).id;
			else las=0;
			if (s2.lower_bound((Node){b[x].r+1,0})!=s2.end())nex=(*s2.lower_bound((Node){b[x].r+1,0})).id;
			else nex=0;
			s1.erase(s1.lower_bound((Node){-b[x].l,0}));
			s2.erase(s2.lower_bound((Node){b[x].r,0}));
			int L=b[x].l,R=(nex?(b[nex].l-1):n),lim=(las?(b[las].r+1):1);
			while (L<=R){
				Triple u=t3.query(1,1,n,L,R);
				if (u.id==0||u.R<lim)break;
				bz[u.id]=1;
				s1.insert((Node){-u.L,u.id});
				s2.insert((Node){u.R,u.id});
				t2.modify2(1,1,q,u.id,0);
				R=u.L-1;
			}
		}
	}
	for (int i=1;i<=q;++i)printf("%d\n",ans[i]);
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 4ms
memory: 38808kb

input:

3 3
0 0 2
1 3
2 3
3 3

output:

3
1
0

result:

ok 3 number(s): "3 1 0"

Test #2:

score: 0
Accepted
time: 4ms
memory: 38864kb

input:

3 2
1 2 2
1 2
1 3

output:

0
3

result:

ok 2 number(s): "0 3"

Test #3:

score: 0
Accepted
time: 8ms
memory: 38836kb

input:

10 10
3 0 3 3 9 7 9 6 0 7
3 3
9 9
4 6
1 9
3 4
2 4
7 10
3 7
5 7
2 7

output:

0
1
0
5
0
1
1
0
0
1

result:

ok 10 numbers

Test #4:

score: -100
Wrong Answer
time: 4ms
memory: 39052kb

input:

10 10
3 0 0 0 5 1 1 1 2 1
1 2
8 8
5 7
1 7
2 2
1 5
5 6
4 6
3 10
6 8

output:

1
0
2
6
1
4
0
2
6
3

result:

wrong answer 4th numbers differ - expected: '7', found: '6'