求助
查看原帖
求助
576527
OI_AKed_me楼主2022/7/3 11:19

我是用可持久化线段树写的,WA #14、#15、#16、#18、#20。 代码:

#include<bits/stdc++.h>
using namespace std;
//const int SIZE(1<<21);
//namespace Fread{char buf[SIZE],*S,*T;inline char getchar(){if(S==T){T=(S=buf)+fread(buf,1,SIZE,stdin);if(S==T){return '\n';}}return *S++;}}
//namespace Fwrite{char buf[SIZE],*S=buf,*T=buf+SIZE;inline void flush(){fwrite(buf,1,S-buf,stdout);S=buf;}inline void putchar(char c){*S++=c;if(S==T){flush();}}struct NTR{~NTR(){flush();}}ztr;}
//#define getchar Fread::getchar
//#define putchar Fwrite::putchar
namespace CCF_NB{
	#define int long long
	#define ll long long
	#define ss stable_sort
	#define inf 2147483647
	#define umap unordered_map
	#pragma GCC opitimize(2)
	#pragma GCC opitimize(3)
	inline void read(string &str){char s=getchar();while(s==' '||s=='\n'||s=='\r'){s=getchar();}while(s!=' '&&s!='\n'&&s!='\r'){str+=s;s=getchar();}}
	inline void read(char &_c){_c=getchar();while(_c==' '||_c=='\n'||_c=='\r') _c=getchar();}
	inline void write(string _str){printf("%s",_str.c_str());}
	inline void write(char _c){putchar(_c);}
	template <typename T> inline void read(T& x){x=0;T f=1;char ch=getchar();while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();x=x*f;return;}
	template <typename T,typename ...Arg>inline void read(T& x,Arg& ...arg){read(x);read(arg...);}
	template <typename T>inline void write(T x){if(x<0)putchar('-'),x=-x;if(x<10)putchar(x+'0');else write(x/10),putchar(x%10+'0');}
	template <typename T,typename ...Arg>inline void write(T x,Arg ...arg){write(x);write(arg...);}
	template <typename T>inline T max(T x,T y){return (x>y)?x:y;}
	template <typename T,typename ...Arg>inline T max(T x,Arg ...arg){return max(x,max(arg...));}
	template <typename T>inline T min(T x,T y){return (x<y)?x:y;}
	template <typename T,typename ...Arg>inline T min(T x,Arg ...arg){return min(x,min(arg...));}
	#define max CCF_NB::max
	#define min CCF_NB::min
	template <typename T>inline T _get(){T _____;read(_____);return _____;}
	template <typename T>inline T gcd(T x,T y){return __gcd(x,y);}
	template <typename T,typename ...Arg>inline T gcd(T x,Arg ...arg){return gcd(x,gcd(arg...));}
}
using namespace CCF_NB;

struct node{
	int ls,rs,sum,maxn,minn;
}tree[20000005]; 
int cnt=0,root[500005],n;
void up(int rt){
    tree[rt].sum=tree[tree[rt].ls].sum+tree[tree[rt].rs].sum;
    tree[rt].maxn=max(tree[tree[rt].ls].sum?tree[tree[rt].ls].maxn:-inf,tree[tree[rt].rs].sum?tree[tree[rt].rs].maxn:-inf);
    tree[rt].minn=min(tree[tree[rt].ls].sum?tree[tree[rt].ls].minn:inf,tree[tree[rt].rs].sum?tree[tree[rt].rs].minn:inf);
}
void Insert(int &rt,int pre,int l,int r,int num){
	rt=++cnt;
	if(l==r){
		tree[rt].sum++;
		tree[rt].maxn=num;
		tree[rt].minn=num;
		return ;
	}
	int mid=(l+r)/2;
	tree[rt]=tree[pre];
	if(num<=mid) Insert(tree[rt].ls,tree[pre].ls,l,mid,num);
	else Insert(tree[rt].rs,tree[pre].rs,mid+1,r,num);
	up(rt);
	return ;
}
void Delete(int &rt,int pre,int l,int r,int num){
	rt=++cnt;
	if(l==r){
		if(tree[rt].sum) tree[rt].sum--;
		if(!tree[rt].sum) tree[rt].minn=inf,tree[rt].maxn=-inf;
		return ;
	}
	int mid=(l+r)/2;
	tree[rt]=tree[pre];
	if(num<=mid) Delete(tree[rt].ls,tree[pre].ls,l,mid,num);
	else Delete(tree[rt].rs,tree[pre].rs,mid+1,r,num);
	up(rt);
	return ;
}
int ask1(int rt,int l,int r,int L,int R){
    if(l>=L&&r<=R) return tree[rt].sum;
    int mid=(l+r)/2,sum=0;
    if(L<=mid&&tree[rt].ls) sum+=ask1(tree[rt].ls,l,mid,L,R);
    if(mid<R&&tree[rt].rs) sum+=ask1(tree[rt].rs,mid+1,r,L,R);
    return sum;
}
int ask2(int rt,int l,int r,int rk){
    if(l==r) return l;
    int mid=(l+r)/2;
    if(tree[rt].ls&&rk<=tree[tree[rt].ls].sum) return ask2(tree[rt].ls,l,mid,rk);
    else return ask2(tree[rt].rs,mid+1,r,rk-tree[tree[rt].ls].sum);
}
int ask3(int rt,int l,int r,int L,int R){
    if(l>=L&&r<=R) return tree[rt].maxn;
    int mid=(l+r)/2,ans1=-inf,ans2=-inf;
   	if(L<=mid&&tree[rt].ls&&tree[tree[rt].ls].sum) ans1=ask3(tree[rt].ls,l,mid,L,R);
	if(mid<R&&tree[rt].rs&&tree[tree[rt].rs].sum) ans2=ask3(tree[rt].rs,mid+1,r,L,R); 
	return max(ans1,ans2);
} 
int ask4(int rt,int l,int r,int L,int R){
    if(l>=L&&r<=R) return tree[rt].minn;
    int mid=(l+r)/2,ans1=inf,ans2=inf;
	if(L<=mid&&tree[rt].ls&&tree[tree[rt].ls].sum) ans1=ask4(tree[rt].ls,l,mid,L,R);
	if(mid<R&&tree[rt].rs&&tree[tree[rt].rs].sum) ans2=ask4(tree[rt].rs,mid+1,r,L,R);
	return min(ans1,ans2);
}
void build(){
	root[0]=++cnt;
}
int _=1;
signed main(){
	read(n);
	build();
	for(int i=1;i<=n;i++){
		int v,op,x,number;
		read(v,op,x);
		switch(op){
			case 1:root[i]=cnt+1;Insert(_,root[v],0,2e9,x+1e9);break;
			case 2:root[i]=cnt+1;Delete(_,root[v],0,2e9,x+1e9);break;
			case 3:root[i]=root[v];write((ll)(ask1(root[v],0,2e9,0,x+1e9-1)+1),'\n');break;
			case 4:root[i]=root[v];write((ll)(ask2(root[v],0,2e9,x)-1e9),'\n');break;
			case 5:root[i]=root[v];number=ask3(root[v],0,2e9,0,x+1e9-1);if(number!=-inf) number-=1e9;write(number,'\n');break;
			case 6:root[i]=root[v];number=ask4(root[v],0,2e9,x+1e9+1,2e9);if(number!=inf) number-=1e9;write(number,'\n');break;
		}
	}

	return 0;
}
2022/7/3 11:19
加载中...