BZOJ3685: 普通van Emde Boas树

版权声明:蒟蒻Blog随意转载 https://blog.csdn.net/a1799342217/article/details/82988589

线段树

题目传送门

set卡了老半天都没卡过去,只好老实写线段树了。8.6s卡过。

代码:

#include<cctype>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 1000005
#define F inline
using namespace std;
struct tree{ int l,r,mx,mn,x; }t[N<<2];
int n,m,now;
F char readc(){
	static char buf[100000],*l=buf,*r=buf;
	if (l==r) r=(l=buf)+fread(buf,1,100000,stdin);
	return l==r?EOF:*l++;
}
F int _read(){
	int x=0; char ch=readc();
	while (!isdigit(ch)) ch=readc();
	while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=readc();
	return x;
}
void build(int x,int l,int r){
	t[x].l=l,t[x].r=r,t[x].mn=1e9;
	if (l==r) return; int mid=l+r>>1;
	build(x<<1,l,mid),build(x<<1|1,mid+1,r);
}
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
F void pshp(int x){
	t[x].mx=max(t[x<<1].mx,t[x<<1|1].mx);
	t[x].mn=min(t[x<<1].mn,t[x<<1|1].mn);
	t[x].x=t[x<<1].x+t[x<<1|1].x;
}
void mdfy(int x,int p,int w){
	if (t[x].l==t[x].r){
		if (t[x].x==w) return; now+=w-t[x].x;
		if (!w) t[x].mx=0,t[x].mn=1e9,t[x].x=0;
		else t[x].mx=t[x].mn=t[x].l,t[x].x=1; return;
	}
	int mid=t[x].l+t[x].r>>1; mdfy(x<<1|(p>mid),p,w),pshp(x);
}
int find(int x,int p){
	if (!p||!t[x].x) return -1;
	if (t[x].l==t[x].r) return t[x].x*2-1;
	return find(x<<1|(p>(t[x].l+t[x].r>>1)),p);
}
int frnt(int x,int p){
	if (!t[x].x||t[x].l>p) return 0; int k;
	if (t[x].l==t[x].r) return t[x].l;
	return (k=frnt(x<<1|1,p))?k:frnt(x<<1,p);
}
int bck(int x,int p){
	if (!t[x].x||t[x].r<p) return 0; int k;
	if (t[x].l==t[x].r) return t[x].l;
	return (k=bck(x<<1,p))?k:bck(x<<1|1,p);
}
int main(){
	n=_read(),m=_read(),build(1,1,n);
	while (m--){
		int f=_read(),x; if (f!=3&&f!=4) x=_read()+1;
		switch (f){
			case 1: mdfy(1,x,1); break;
			case 2: mdfy(1,x,0); break;
			case 3: now?printf("%d\n",t[1].mn-1):puts("-1"); break;
			case 4: now?printf("%d\n",t[1].mx-1):puts("-1"); break;
			case 5: printf("%d\n",frnt(1,x-1)-1); break;
			case 6: printf("%d\n",bck(1,x+1)-1); break;
			case 7: printf("%d\n",find(1,x)); break;
		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/a1799342217/article/details/82988589