一种30颗线段树做法,0分求调
查看原帖
一种30颗线段树做法,0分求调
785544
fangminding楼主2024/3/12 15:24

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
struct node
{
	int l,r,cnt[34],lazyc;
	bool hl;
}tree[300005];
int L,T,Q;

void bt(int i,int l,int r)
{
	tree[i].l=l;tree[i].r=r;
	tree[i].cnt[1]=r-l+1;
	if(l!=r)
	{
		bt(i*2,l,(l+r)/2);
		bt(i*2+1,(l+r)/2+1,r);
	}
}

void update(int nod)
{
	if(tree[nod].l==tree[nod].r)return;
	for(int i = 1;i <=T;i++)tree[nod].cnt[i]=tree[nod*2].cnt[i]+tree[nod*2+1].cnt[i];
	tree[nod].hl=false;
	tree[nod].lazyc=0;
 } 
void pushdown(int nod)
{
	if(!tree[nod].hl)return;
	if(tree[nod].l==tree[nod].r)return;
	tree[nod*2].lazyc=tree[nod*2+1].lazyc=tree[nod].lazyc;
	tree[nod*2].hl=tree[nod*2+1].hl=tree[nod].hl;
	for(int i = 1;i <=T;i++)
	{
		tree[nod*2].cnt[i]=0;
		tree[nod*2+1].cnt[i]=0;
	}
	tree[nod*2].cnt[tree[nod].lazyc]=tree[nod*2].r-tree[nod*2].l+1; 
	tree[nod*2+1].cnt[tree[nod].lazyc]=tree[nod*2+1].r-tree[nod*2+1].l+1; 
	tree[nod].hl=false;tree[nod].lazyc=0;
}
void change(int nod,int l,int r,int k)
{
	if(tree[nod].l==l&&tree[nod].r==r)
	{
		tree[nod].lazyc=k;tree[nod].hl=true;
		for(int i = 1;i <=T;i++)tree[nod].cnt[i]=0;
		tree[nod].cnt[k]=r-l+1;
		return;
	}
	pushdown(nod);
	if(r<=tree[nod*2].r)
	{
		change(nod*2,l,r,k);
		return;
	}
	if(l>=tree[nod*2+1].l)
	{
		change(nod*2+1,l,r,k);
		return;
	}
	change(nod*2,l,tree[nod*2].r,k);
	change(nod*2+1,tree[nod*2+1].l,r,k);
	update(nod);
}

int find(int nod,int l,int r)
{
	if(tree[nod].l==l&&tree[nod].r==r)
	{
		int ansss=0;
		for(int i = 1;i <=T;i++) if(tree[nod].cnt[i]) ansss|=(1<<i);
		return ansss;
	}
	pushdown(nod);
	if(r<=tree[nod*2].r) return find(nod*2,l,r);
	if(l>=tree[nod*2+1].l) return find(nod*2+1,l,r);
	return (find(nod*2,l,tree[nod*2].r)|find(nod*2+1,tree[nod*2+1].l,r));
}

signed main()
{
	cin>>L>>T>>Q;
	bt(1,1,L);
	char type;
	int AA,BB,CC;
	for(int i = 1;i <=Q;i++)
	{
		cin>>type>>AA>>BB;
		if(AA>BB)
			swap(AA,BB); 
		if(type=='C')
		{
			cin>>CC;
			change(1,AA,BB,CC);
			continue;
		}
		else
		{
			int ans=find(1,AA,BB);
			int cntt=0;
			while(ans)
			{
				if(ans&1)cntt++;
				ans>>=1;
			}
			cout<<cntt<<endl;
		}
	}
	return 0;
}
2024/3/12 15:24
加载中...