社区讨论
大佬求条,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 条回复,欢迎继续交流。
正在加载回复...