样例二过不了
查看原帖
样例二过不了
794701
wo_hen_la楼主2024/7/30 16:27

/bx

#include <bits/stdc++.h>
using namespace std;

#define sp putchar(' ')
#define en putchar('\n')
#define pb push_back
#define int long long
#define P 998244353
#define HP 1000000000000002097
#define N (int)(5e5+5)

int read(){ char ch=getchar();int x=0,f=1;while(ch>'9' || ch<'0'){if(ch=='-') f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^48),ch=getchar();return x*f; }
void print(int x){ if(x<0) putchar('-'),x=-x;if(x>9)print(x/10);putchar(x%10+'0'); }

int n,m;
char a[N];
struct Tree{ int o,i,io,oi,ioi; }tr[N*4];

void up(int k)
{
	int l=k<<1,r=k<<1|1;
	tr[k].i=tr[l].i+tr[r].i;
	tr[k].o=tr[l].o+tr[r].o;
	tr[k].io=tr[l].io+tr[r].io+tr[l].i*tr[r].o;
	tr[k].oi=tr[l].oi+tr[r].oi+tr[l].o*tr[r].i;
	tr[k].ioi=tr[l].ioi+tr[r].ioi+tr[l].i*tr[r].oi+tr[l].io*tr[r].i;
}
void build(int k,int l,int r)
{
	if(l==r){
		if(a[l]=='O') tr[k].o=1;
		else tr[k].i=1;
		return;
	}
	int mid=(l+r)>>1;
	build(k<<1,l,mid);
	build(k<<1|1,mid+1,r);
	up(k);
}
void modify(int k,int l,int r,int ql,int qr,char val)
{
	if(l>=ql && r<=qr){
		//tr[k].i=tr[k].o=tr[k].io=tr[k].oi=tr[k].ioi=0;
		if(val=='O') tr[k].i=0,tr[k].o=1;
		else tr[k].o=0,tr[k].i=1;
		return;
	}
	int mid=(l+r)>>1;
	if(ql<=mid) modify(k<<1,l,mid,ql,qr,val);
	if(qr>mid) modify(k<<1|1,mid+1,r,ql,qr,val);
	up(k);
}
Tree query(int k,int l,int r,int ql,int qr)
{
	if(l>=ql && r<=qr) return tr[k];
	int cnt=0,mid=(l+r)>>1;
	Tree trl,trr,tre;
	if(ql<=mid) trl=query(k<<1,l,mid,ql,qr); 
	if(qr>mid) trr=query(k<<1|1,mid+1,r,ql,qr);
	if(ql<=mid && qr>mid){
		tre.i=trl.i+trr.i;
		tre.o=trl.o+trr.o;
		tre.io=trl.io+trr.io+trl.i*trr.o;
		tre.oi=trl.oi+trr.oi+trl.o*trr.i;
		tre.ioi=trl.ioi+trr.ioi+trl.i*trr.oi+trl.io*trr.i;
		return tre;
	}
	else if(ql<=mid) trl; 
	else return trr;
}
main()
{
	ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	int op,x,y;
	char c;
	while(m--){
		cin>>op;
		if(op==1){
			cin>>x>>c;
			modify(1,1,n,x,x,c);
		}
		else{
			cin>>x>>y;
			cout<<query(1,1,n,x,y).ioi<<"\n";
		}
	}
	return 0;
}

2024/7/30 16:27
加载中...