社区讨论

大佬求条,MLE+RE

P2846[USACO08NOV] Light Switching G参与者 2已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mhju7i13
此快照首次捕获于
2025/11/04 08:35
4 个月前
此快照最后确认于
2025/11/04 08:35
4 个月前
查看原帖
蒟蒻刚学线段树,看了好久不知道哪错了
CPP
#include<bits/stdc++.h>
using namespace std;

const int N=8e6+10;
struct node{
	int sum;
	int lz;
}tree[N];
int n,m,s,e,op;

inline void push_down(int i,int l,int r){
	if(tree[i].lz){
		int mid=(l+r)>>1;
		tree[i<<1].lz^=1;
		tree[i<<1|1].lz^=1;
		tree[i<<1].sum=mid-l+1-tree[i<<1].sum;
		tree[i<<1|1].sum=r-mid-tree[i<<1|1].sum;
		tree[i].lz=0;
	}
}

inline int push_up(int i){
	tree[i].sum=tree[i<<1].sum+tree[i<<1|1].sum;
}

inline void change(int i,int l,int r,int kl,int kr){
	if(l>=kl&&r<=kr){
		tree[i].lz^=1;
		tree[i].sum=r-l+1-tree[i].sum;
		return;
	}
	push_down(i,l,r);
	int mid=(l+r)>>1;
	if(mid>=kl) change(i*2,l,mid,kl,kr);
	if(mid+1<=kr) change(i*2+1,mid+1,r,kl,kr);
	push_up(i);
}

inline long long search(int i,int l,int r,int kl,int kr){
	if(l>=kl&&r<=kr) return tree[i].sum;
	push_down(i,l,r);
	int mid=(l+r)>>1;
	long long ans=0;
	if(mid>=kl) ans+=search(i*2,l,mid,kl,kr);
	if(mid+1<=kr) ans+=search(i*2+1,mid+1,r,kl,kr);
	return ans;
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>op>>s>>e;
		if(op==0) change(1,1,n,s,e);
		else cout<<search(1,1,n,s,e)<<endl;
	}	
}

回复

2 条回复,欢迎继续交流。

正在加载回复...