刚学OI蒟蒻求助,线段树10pts
查看原帖
刚学OI蒟蒻求助,线段树10pts
332486
233小问号楼主2021/7/13 10:50

rt 萌新对着题解看了半天

#include<bits/stdc++.h>
#define lc(x) (x<<1)
#define	rc(x) ((x<<1)|1)
using namespace std;
const int mxn=1e5;
int light[mxn<<2];
bool lazy_tag[mxn<<2];
inline void pushdown(int root,int left_range,int right_range)
{
	if(lazy_tag[root])
	{
		lazy_tag[lc(root)]^=1;
		lazy_tag[rc(root)]^=1;
		int mid=(left_range+right_range)>>1;
		light[lc(root)]=(mid-left_range+1)-light[lc(root)];
		light[rc(root)]=(right_range-mid)-light[rc(root)];
		lazy_tag[root]=0;
	}
	return;
}
inline void modify(int root,int left_range,int right_range,int start,int end)
{
	if(start<=left_range && right_range<=end)
	{
		light[root]=(right_range-left_range+1)-light[root];
		lazy_tag[root]^=1;
		return;
	}
	pushdown(root,left_range,right_range);
	int mid=(left_range+right_range)>>1;
	if(start<=mid)	modify(lc(root),left_range,mid,start,end);	
	if(mid<end)	modify(rc(root),mid+1,right_range,start,end);
	light[root]=light[lc(root)]+light[rc(root)];
}
inline int query(int root,int left_range,int right_range,int start,int end)
{
	if(start<=left_range && right_range<=end)
		return light[root];
	pushdown(root,left_range,right_range);
	int a=0,b=0,mid=(left_range+right_range)>>1;
	if(start<=mid) a=query(lc(root),left_range,mid,start,end);
    if(mid<end) b=query(rc(root),mid+1,right_range,start,end);
    return a+b;
}
int main(){
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int left_range,right_range;
		bool op;
		cin>>op>>left_range>>right_range;
		if(!op)
			modify(1,left_range,right_range,1,n);
		else
			cout<<query(1,left_range,right_range,1,n)<<endl;
	}
	return 0;
}

实在是不会调了

2021/7/13 10:50
加载中...