救助
查看原帖
救助
1147171
Merge_all楼主2024/10/2 09:45

这道题我用的是离线+离散化+线段树,第 3 个样例就是过不去。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int n;
int value[N],len;
struct Node{
	int opt,x,y;
}ask[N];
unordered_map<int,int> mp;
struct SegmentTree{
	int l,r,x,lazy;
}tree[N<<2];
void push_up(int u){
	
}
void push_down(int u){
	auto &root=tree[u],&lson=tree[u<<1],&rson=tree[u<<1];
	if(root.lazy) lson.lazy=1,rson.lazy=1,root.lazy=0;
}
void build(int u,int l,int r){
	if(l==r){tree[u]={l,r,0,0};return ;}
	else{
		tree[u].l=l,tree[u].r=r,tree[u].lazy=0;
		int mid=l+r>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
	}
}
void modify(int u,int x,int v){
	if(tree[u].l==x&&tree[u].r==x){
		if(tree[u].lazy) tree[u].lazy=0,tree[u].x=1+v;
		else tree[u].x+=v;
		if(tree[u].x<0) tree[u].x=0;
		return ;
	}
	else{
		push_down(u);
		int mid=tree[u].l+tree[u].r>>1;
		if(x<=mid) modify(u<<1,x,v);
		else modify(u<<1|1,x,v);
	}
}
int query(int u,int x){
	if(tree[u].l==x&&tree[u].r==x){
		if(tree[u].lazy) return 1;
		return tree[u].x;
	}
	else{
		push_down(u);
		int mid=tree[u].l+tree[u].r>>1;
		if(x<=mid) return query(u<<1,x);
		else return query(u<<1|1,x);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr),cout.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>ask[i].opt;
		ask[i].x=-1e15,ask[i].y=-1e15;
		if(ask[i].opt==4) cin>>ask[i].x,value[++len]=ask[i].x;
		else if(ask[i].opt<3) cin>>ask[i].x>>ask[i].y,value[++len]=ask[i].x;
	}
	sort(value+1,value+len+1);
	len=unique(value+1,value+len+1)-value-1;
	for(int i=1;i<=len;i++) mp[value[i]]=i;
	for(int i=1;i<=n;i++) ask[i].x=mp[ask[i].x];
//	cout<<"\n";
//	for(int i=1;i<=n;i++) cout<<ask[i].opt<<" "<<ask[i].x<<" "<<ask[i].y<<"\n";
	build(1,1,n);
	for(int i=1;i<=n;i++){
		if(ask[i].opt==1) modify(1,ask[i].x,ask[i].y);
		else if(ask[i].opt==2) modify(1,ask[i].x,-ask[i].y);
		else if(ask[i].opt==3) tree[1].lazy=1;
		else cout<<query(1,ask[i].x)<<"\n";
		
//		cout<<"i="<<i<<" query()="<<query(1,1)<<"\n";
	}
	return 0;
}
2024/10/2 09:45
加载中...