线段树求调
  • 板块学术版
  • 楼主HX_ztx
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/10/21 20:37
  • 上次更新2024/10/21 20:47:06
查看原帖
线段树求调
945933
HX_ztx楼主2024/10/21 20:37

题目

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
#define int long long
int n,m,lz[N*4],w[N*4],opt,x,y;
void pushup(int u){
	w[u]=w[u*2]+w[u*2+1];
}
//void build(int u,int l,int r){
//	if(l==r){
//		w[u]=a[l];
//		return ;
//	}
//	int m=(l+r)>>1;
//	build(u*2,l,m);
//	build(u*2+1,m+1,r);
//	pushup(u);
//}
bool in(int l,int r,int x,int y){
	return (l>=x)&&(r<=y);
} 
bool out(int l,int r,int x,int y){
	return (l>y)||(r<x);
}
void work(int u,int l,int r){
	lz[u] ^=1;
	w[u]=(r-l+1)-w[u];
}
void pushdown(int u,int l,int r){
	if(!w[u])return ;
	int m=(l+r)>>1;
	work(u*2,l,m);
	work(u*2+1,m+1,r);
	lz[u]=0;
}
void update(int u,int l,int r,int x,int y){
	if(in(l,r,x,y)){
		work(u,l,r);
		return ;
	}
	else if(!out(l,r,x,y)){
		int m=(l+r)>>1;
		pushdown(u,l,r);
		update(u*2,l,m,x,y);
		update(u*2+1,m+1,r,x,y);
		pushup(u);
	}
}
int query(int u,int l,int r,int x,int y){
	if(in(l,r,x,y)){
		return w[u];
	}
	else if(!out(l,r,x,y)){
		int m=(l+r)>>1;
		pushdown(u,l,r);
		return query(u*2,l,m,x,y)+query(u*2+1,m+1,r,x,y);
	}
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
//	build(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>opt>>x>>y;
		if(opt==1){
			cout<<query(1,1,n,x,y)<<endl;
		}
		else {
			update(1,1,n,x,y);
		}
	}
	return 0;
}

交进去一直RE,但是数组已经够大了吧

2024/10/21 20:37
加载中...