样例过 全RE
查看原帖
样例过 全RE
1011275
Glass_S楼主2024/6/2 21:45

救救

#include<iostream>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<cstdio>
#include<ctime>
#include<stack>
#define int long long
#define lp p<<1
#define rp p<<1|1
#define mid (l+r)>>1
#define M 400010
using namespace std;
int l,t,o;
char x,y,op;
int sum[31][M],tag[31][M];
int re()
{
	int x=0,p=1;
	char y=getchar();
	for(;y>'9'||y<'0';y=getchar())
		if(y=='-')
			p=-p;
	for(;y>='0'&&y<='9';y=getchar())
		x=x*10+y-'0';
	return x*p;
}
void wr(int x)
{
	if(x<0)
		x=-x,putchar('-');
	if(x>9)
		wr(x/10);
	putchar(x%10+'0');
}
void Push_up(int i,int p)
{
	sum[i][p]=sum[i][lp]+sum[i][rp];
}
void Push_down(int i,int p)
{
	if(tag[i][p]==-1)
	{
		sum[i][lp]=sum[i][rp]=0;
		tag[i][lp]=tag[i][rp]=-1;
	}
	else 
	{
		sum[i][rp]=sum[i][lp]=tag[i][p];
		tag[i][lp]=tag[i][rp]=tag[i][p];
	}
	tag[i][p]=0;
}
void Build(int i,int l,int r,int p)
{
	if(l==r)
	{
		sum[i][p]=1;
		return;
	}
	Build(i,l,mid,lp);
	Build(i,mid+1,r,rp);
	Push_up(i,p);
}
void Change(int i,int cl,int cr,int l,int r,int p,int k)
{
	if(cl<=l&&cr>=r)
	{
		sum[i][p]=k;
		if(!k)
		    tag[i][p]=-1;
		else 
		    tag[i][p]=k;
		return;
	}
	if(tag[i][p])
	    Push_down(i,p);
	if(cl<=mid)
	    Change(i,cl,cr,l,mid,lp,k);
	if(cr>mid)
	    Change(i,cl,cr,mid+1,r,rp,k);
	Push_up(i,p);
}
int Query(int i,int ql,int qr,int l,int r,int p)
{
	if(ql<=l&&qr>=r)
		return sum[i][p];
	if(tag[i][p])
	   Push_down(i,p);
	return Query(i,ql,qr,l,mid,lp)+Query(i,ql,qr,mid+1,r,rp);
}
signed main()
{
	l=re(),t=re(),o=re();
	Build(1,1,l,1);
	while(o--)
	{
		cin>>op;
		x=re(),y=re();
		if(x>y)
		    swap(x,y);
		if(op=='C')
		{
			int z;
			z=re();
			for(int i=1;i<=t;i++)
			{
				if(z!=i)
				    Change(i,x,y,1,l,1,0);
				else
				    Change(i,x,y,1,l,1,1);
			}
		}
		else 
		{
			int ans=0;
		    for(int i=1;i<=t;i++)
		    {
		    	if(Query(i,x,y,1,l,1))
		    	    ans++;
			}
			wr(ans),putchar('\n');
		}
	}
	return 0;
}
2024/6/2 21:45
加载中...