只能过样例的RE求调Orz
查看原帖
只能过样例的RE求调Orz
1110135
I_sland楼主2024/3/17 01:24
#include<bits/stdc++.h>
#define N 100050
typedef long long ll;
using namespace std;
ll n,m;
struct Tr{
	ll sum,l,r;
};
Tr tr[N*4];
ll lazy[4*N];
vector<ll>ans;
void build(ll k,ll l,ll r){
	tr[k].l=l;
	tr[k].r=r;
	tr[k].sum=0;
	if(l<r){
		ll mid=(l+r)/2;
		build(2*k,l,mid);
		build(2*k+1,mid+1,r);	
	}
}
void pushdown(ll k){
	if(tr[k].l==tr[k].r){
		return;
	}
	lazy[2*k]+=lazy[k];
	lazy[2*k+1]+=lazy[k];
	if(lazy[k]%2){
		tr[2*k].sum=tr[2*k].r-tr[2*k].l+1-tr[2*k].sum;
		tr[2*k+1].sum=tr[2*k].r-tr[2*k].l+1-tr[2*k+1].sum;
	}
	lazy[k]=0;
}
void change(ll k,ll l,ll r){
	ll L=tr[k].l;
	ll R=tr[k].r;
	if(l>R||r<L){
		return;
	}
	if(l<=L && R<=r){
		tr[k].sum=R-L+1-tr[k].sum;
		lazy[k]++;
	}else{
		ll mid=(L+R)/2;
		pushdown(k);
		if(l<=mid){
			change(2*k,l,r);
		}
		if(mid+1<=R){
			change(2*k+1,l,r);
		}
		tr[k].sum=tr[2*k].sum+tr[2*k+1].sum;
	}
}
ll check(ll k,ll l,ll r){
	ll L=tr[k].l;
	ll R=tr[k].r;
	ll mid=(L+R)/2;
	pushdown(k);
	if(l<=L && R<=r){
		return tr[k].sum;
	}
	ll all=0;
	if(l<=mid){
		all+=check(2*k,l,r);
	}
	if(mid+1<=r){
		all+=check(2*k+1,l,r);
	}
	return all;
}
int main(){
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		ll c,a,b;
		scanf("%lld %lld %lld",&c,&a,&b);
		if(c){
			ans.push_back(check(1,a,b));
		}else{
			change(1,a,b);
		}
	}
	for(auto p=ans.begin();p!=ans.end();p++){
		cout<<*p<<endl;
	}
	return 0;
}
2024/3/17 01:24
加载中...