P2846 sgt求调
  • 板块灌水区
  • 楼主Xiphi
  • 当前回复7
  • 已保存回复7
  • 发布时间2023/2/10 18:00
  • 上次更新2023/10/24 01:14:30
查看原帖
P2846 sgt求调
667250
Xiphi楼主2023/2/10 18:00

rt

lz很菜,连最简单的sgt都过不了(((

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<string>
#include<cmath>
#include<cstring>
#include<set>
#include<map>
#define ll long long
using namespace std;
const int N=100005;
struct sgt{
	int l,r;
	long long d,tag;
}t[4*N];
int getd(int p){
	return t[p].r-t[p].l+1-t[p].d;
}
void pushdown(int p){
	if(t[p].tag==1){
		t[p*2].tag^=1,t[p*2+1].tag^=1;
		t[p*2].d=getd(p*2);
		t[p*2+1].d=getd(p*2+1);
		t[p].tag=0;
	}
}
void build(int p,int l,int r){
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].d=0,t[p].tag=0;
		return ;
	}
	int mid=(l+r)>>1;
	build(p*2,l,mid),build(p*2+1,mid+1,r);
	t[p].d=t[p*2].d+t[p*2+1].d;
}
int query(int p,int l,int r){
	if(t[p].l==l&&t[p].r==r){
		return t[p].d;
	}
	int mid=(l+r)>>1;
	pushdown(p);
	if(r<=mid) return query(p*2,l,r);
	else if(l>=mid+1) return query(p*2+1,l,r);
	else return query(p*2,l,mid)+query(p*2+1,mid+1,r);
}
void change(int p,int l,int r){
	cout<<p<<' '<<l<<' '<<r<<'\n';
	if(t[p].l>=l&&t[p].r<=r){
		t[p].tag^=1;
		t[p].d=((t[p].r-t[p].l+1)-t[p].d);
		return ;
	}
	int mid=(l+r)>>1;
	pushdown(p);
	if(mid>=l)change(p*2,l,r);
	if(mid<r)change(p*2+1,l,r);
	t[p].d=t[p*2].d+t[p*2+1].d;
}


int main(){
//	freopen("test.in","r",stdin);
//	freopen("test.out","w",stdout);
	int n,m;
	cin>>n>>m;
	build(1,1,n);
	while(m--){
		int op,s,e;
		cin>>op>>s>>e;
		
		if(op==0) change(1,s,e);
		else cout<<query(1,s,e)<<'\n';
	}
	return 0;
}



2023/2/10 18:00
加载中...