萌新试图用平衡树上ODT来写,但是挂了
查看原帖
萌新试图用平衡树上ODT来写,但是挂了
264548
Tangent233楼主2021/8/25 11:10
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct chiholly
{
	int l,r;
	int v;
};
struct tr
{
	int l,r,pri,dele;
	chiholly node;
	unsigned long long kind;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define p(x) tree[x].pri
	#define n(x) tree[x].node
	#define k(x) tree[x].kind
	#define de(x) tree[x].dele
}tree[maxn];
stack <int> bin;
int cnt,rt,x,y,z;
int count(unsigned int x)
{
	int ans=0;
	for(int i=0;i<=40;i++)
	{
		if(x&1) ans++;
		x>>=1;
	}
	return ans;
}
void update(int now)
{
	if(!now) return;
	if(l(now)) k(now)|=k(l(now));
	if(r(now)) k(now)|=k(r(now));
	k(now)|=(1<<(n(now).v));
}
void pushdown(int x)
{
	if(l(x)) bin.push(l(x));
	if(r(x)) bin.push(r(x));
}
int newnode(int v,int l,int r)
{
	int po;
	if(!bin.empty())
	{
		po=bin.top();
		bin.pop();
		pushdown(po);
		p(po)=rand();
		de(po)=0;
		l(po)=r(po)=0;
		n(po).l=l;n(po).r=r;n(po).v=v;
		return po;
	}
	else
	{
		p(++cnt)=rand();
		n(cnt).l=l;n(cnt).r=r;n(cnt).v=v;
		k(cnt)=(1<<n(cnt).v);
		return cnt;
	}
}

void split(int now,int val,int &x,int &y)
{
	if(!now) x=y=0;
	else
	{
		if(n(now).l<=val)
		{
			x=now;
			split(r(now),val,r(now),y);
		}
		else
		{
			y=now;
			split(l(now),val,x,l(now));
		}
	}
	update(now);
}
int merge1(int x,int y)
{
	if(!x||!y) return x+y;
	if(p(x)>p(y))
	{
		r(x)=merge1(r(x),y);
		update(x);
		return x;
	}
	else
	{
		l(y)=merge1(x,l(y));
		update(y);
		return y;
	}
}
int regionsplit(int l,int r)
{
	split(rt,l-1,x,y);
	split(y,r,y,z);
	int po1=x,po2=y;
	while(r(po1)) po1=r(po1);
	while(r(po2)) po2=r(po2);
	int l1,r1,v1;
	if(n(po1).r>=l)
	{
		l1=n(po1).l,r1=n(po1).r,v1=n(po1).v;
		n(po1).r=l-1;
		y=merge1(newnode(v1,l,r1),y);
	}
	if(n(po2).r>=r)
	{
		l1=n(po2).l,r1=n(po2).r,v1=n(po2).v;
		n(po2).r=r;
		z=merge1(newnode(v1,r+1,r1),z);
	}
	return y;
}
void pushiron(int l,int r,int v)
{
	int nowrt=regionsplit(l,r);
	de(nowrt)=1;
	bin.push(nowrt);
	rt=merge1(x,merge1(newnode(v,l,r),z));
}
int ask(int l,int r)
{
	int nowrt=regionsplit(l,r);
	int ans=count(k(nowrt));
	rt=merge1(x,merge1(nowrt,z));
	return ans;
}
int main()
{
	int n,t,m;
	cin>>n>>t>>m;
	rt=newnode(1,1,n);
	for(int i=1;i<=m;i++)
	{
		char opt;int l,r,v;
		cin>>opt>>l>>r;
		if(opt=='C')
		{
			cin>>v;
			pushiron(l,r,v);
		}
		else
			cout<<ask(l,r)<<endl;
	}
	return 0;
}
2021/8/25 11:10
加载中...