C++线段树求助,20分
  • 板块P2073 送花
  • 楼主崔化博
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/2/24 15:55
  • 上次更新2023/10/28 07:50:46
查看原帖
C++线段树求助,20分
304524
崔化博楼主2022/2/24 15:55
#include<bits/stdc++.h> 
#define N 100000
#define int long long
using namespace std;
int n;
struct Tree{
	int mei,jia,maxn1,maxn2,minn1,minn2;
}tree[4*N];
bool num[1000005];
void update1(int l,int r,int root,int p1,int p2,int p3){
	if(l==r){
		tree[root].mei=p2;
		tree[root].jia=p3;
		tree[root].maxn1=tree[root].minn1=p3;
		tree[root].maxn2=tree[root].minn2=r;
		return ;
	}
	int mid=(l+r)>>1;
	if(p1<=mid)
		update1(l,mid,root<<1,p1,p2,p3);
	else
		update1(mid+1,r,root<<1|1,p1,p2,p3);
	tree[root].mei=tree[root<<1].mei+tree[root<<1|1].mei;
	tree[root].jia=tree[root<<1].jia+tree[root<<1|1].jia;
	if(tree[root<<1].maxn1>tree[root<<1|1].maxn1){
		tree[root].maxn1=tree[root<<1].maxn1;
		tree[root].maxn2=tree[root<<1].maxn2;
	}
	else{
		tree[root].maxn1=tree[root<<1|1].maxn1;
		tree[root].maxn2=tree[root<<1|1].maxn2;
	}
	if(tree[root<<1].minn1<tree[root<<1|1].minn1){
		tree[root].minn1=tree[root<<1].minn1;
		tree[root].minn2=tree[root<<1].minn2;
	}
	else{
		tree[root].minn1=tree[root<<1|1].minn1;
		tree[root].minn2=tree[root<<1|1].minn2;
	}
}
void update2(int l,int r,int root){
	if(l==r){
        num[tree[root].jia]=0;
		tree[root].jia=tree[root].mei=tree[root].maxn1=tree[root].maxn2=tree[root].minn2=0;
        tree[root].minn1=0x3f3f3f3f;
		return ;
	}
	int mid=(l+r)>>1;
	if(tree[root].minn2<=mid)
		update2(l,mid,root<<1);
	else
		update2(mid+1,r,root<<1|1);
	tree[root].mei=tree[root<<1].mei+tree[root<<1|1].mei;
	tree[root].jia=tree[root<<1].jia+tree[root<<1|1].jia;
	if(tree[root<<1].maxn1>tree[root<<1|1].maxn1){
		tree[root].maxn1=tree[root<<1].maxn1;
		tree[root].maxn2=tree[root<<1].maxn2;
	}
	else{
		tree[root].maxn1=tree[root<<1|1].maxn1;
		tree[root].maxn2=tree[root<<1|1].maxn2;
	}
	if(tree[root<<1].minn1<tree[root<<1|1].minn1){
		tree[root].minn1=tree[root<<1].minn1;
		tree[root].minn2=tree[root<<1].minn2;
	}
	else{
		tree[root].minn1=tree[root<<1|1].minn1;
		tree[root].minn2=tree[root<<1|1].minn2;
	}
}
void update3(int l,int r,int root){
	if(l==r){
        num[tree[root].jia]=0;
		tree[root].jia=tree[root].mei=tree[root].maxn1=tree[root].maxn2=tree[root].minn2=0;
        tree[root].minn1=0x3f3f3f3f;
		return ;
	}
	int mid=(l+r)>>1;
	if(tree[root].maxn2<=mid)
		update3(l,mid,root<<1);
	else
		update3(mid+1,r,root<<1|1);
	tree[root].mei=tree[root<<1].mei+tree[root<<1|1].mei;
	tree[root].jia=tree[root<<1].jia+tree[root<<1|1].jia;
	if(tree[root<<1].maxn1>tree[root<<1|1].maxn1){
		tree[root].maxn1=tree[root<<1].maxn1;
		tree[root].maxn2=tree[root<<1].maxn2;
	}
	else{
		tree[root].maxn1=tree[root<<1|1].maxn1;
		tree[root].maxn2=tree[root<<1|1].maxn2;
	}
	if(tree[root<<1].minn1<tree[root<<1|1].minn1){
		tree[root].minn1=tree[root<<1].minn1;
		tree[root].minn2=tree[root<<1].minn2;
	}
	else{
		tree[root].minn1=tree[root<<1|1].minn1;
		tree[root].minn2=tree[root<<1|1].minn2;
	}
}
signed main(){
//	freopen("a.in","r",stdin);
	int p,w,c;
	while(cin>>p&&p!=-1){
		if(p==1){
			cin>>w>>c;
			if(!num[c])
				update1(1,N,1,++n,w,c);
			num[c]=1;
		}
		else{
			if(p==2){
				if(tree[1].mei&&tree[1].jia)
					update3(1,N,1);
			}
			else{
				if(tree[1].mei&&tree[1].jia)
					update2(1,N,1);
			}
		}
	}	
	cout<<tree[1].mei<<' '<<tree[1].jia;
    return 0;
}
2022/2/24 15:55
加载中...