动态开点线段树

<发现自己写代码的能力好垃圾...也可能是饿的>

一下午在debug...跟昨天一样,自己写了份动态开点的代码,然后最后告诉自己清醒一点清楚每个变量要干什么终于解决了.QWQ

code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e6+5;
const int mod=1e9+7;
//区间修改 维护区间最值. 
struct Seg{
	int mx[N],lz[N],lc[N],rc[N],id=1;
	void me()
	{
		for(int i=1;i<N;i++)	mx[i]=lz[i]=lc[i]=rc[i]=0;
	}
	void pushup(int u)
	{
		mx[u]=max(mx[lc[u]],mx[rc[u]]);
	}
	void pushdown(int u)
	{
		if(lz[u])
		{
			if(!rc[u])	rc[u]=++id;
			if(!lc[u])	lc[u]=++id;
			mx[rc[u]]=max(mx[rc[u]],lz[u]);
			mx[lc[u]]=max(mx[lc[u]],lz[u]);
			lz[rc[u]]=max(lz[rc[u]],lz[u]);
			lz[lc[u]]=max(lz[lc[u]],lz[u]);
			lz[u]=0;
		}
	}
	void change(int &o,int l,int r,int L,int R,int val)
	{
		if(!o)	o=++id;
		if(L<=l&&r<=R)
		{
			mx[o]=max(mx[o],val);
			lz[o]=max(lz[o],val);
			return;
		}
		int mid=(l+r)>>1;
		pushdown(o);
		if(L<=mid)	change(lc[o],l,mid,L,R,val);
		if(R>mid)	change(rc[o],mid+1,r,L,R,val);	
		pushup(o);
	}
	int query(int o,int l,int r,int pos)
	{
		if(!o)	return 0;
		if(pos<=l&&pos>=r)	
		{
			return mx[o];
		}
		pushdown(o);
		int res=0;
		int mid=(l+r)>>1;
		if(pos<=mid)		res=max(res,query(lc[o],l,mid,pos));
		if(pos>mid)			res=max(res,query(rc[o],mid+1,r,pos));
		return res;
	}
	
}R,C;
map<pair<int,int>,bool>vis;
int main()
{
	int n,q;
	scanf("%d%d",&n,&q);
	R.me();C.me();
	while(q--)
	{
		int x,y;char op;
		cin>>x>>y>>op;
		if(vis[{x,y}])	
		{
			puts("0");
			continue;
		}
		else vis[{x,y}]=true;
		if(op=='L')
		{
			int res=C.query(1,1,n,y);
			cout<<x-res<<'\n';
			int rt=1;
			R.change(rt,1,n,res+1,x,y);
		}
		else
		{
			int res=R.query(1,1,n,x);
			cout<<y-res<<'\n';
			int rt=1;
			C.change(rt,1,n,res+1,y,x);
		}
	}
	return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

小谷围鸡肉卷阿姨:+1,腾子投完一动不动
点赞 评论 收藏
分享
尊嘟假嘟点击就送:加v细说,问题很大
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务