线段树10分,仅A2,其他全WA,
查看原帖
线段树10分,仅A2,其他全WA,
142549
hbhz_zcy楼主2021/7/7 22:20

注:好久没有写线段树了,部分代码可能有不符合常理之处

code

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn=1e5+10;int n,m;
struct node{int l,r,v;bool lazy;}f[4*maxn];
void pushup(int t){f[t].v=f[t<<1].v+f[t<<1|1].v;}
void rvs(int t){f[t].v=f[t].r-f[t].l+1-f[t].v;}
void pushdown(int t){
	if(!f[t].lazy)  return;
	rvs(t<<1),rvs(t<<1|1);
	f[t].lazy=0,f[t<<1].lazy++,f[t<<1|1].lazy++;
	return;
}
void build(int t,int l,int r){
	f[t].l=l,f[t].r=r;
	if(l==r)  return;
	int m=(l+r)/2;
	build(t<<1,l,m),build(t<<1|1,m+1,r);
	return;
}
void change(int t,int ul,int ur){
	int l=f[t].l,r=f[t].r;
	if(l==r){rvs(t);return;}
	if(ul<=l&&r<=ur){
		rvs(t);f[t].lazy++;
		return;
	}
	pushdown(t);int m=(l+r)/2;
	if(ul<=m)  change(t<<1,ul,ur);
	if(ur>m)  change(t<<1|1,ul,ur);
	pushup(t);return;
}
int getsum(int t,int ul,int ur){
	int l=f[t].l,r=f[t].r;
	if(ul<=l&&r<=ur)  return f[t].v;
	int m=(l+r)/2,rt=0;pushdown(t);
	if(ul<=m)  rt+=getsum(t<<1,ul,ur);
	if(ur>m)  rt+=getsum(t<<1|1,ul,ur);
	return rt;
}
void ts(){
	for(int i=1;i<=2*n;i++)
		printf("%d:%d,%d,%d,%d\n",i,f[i].l,f[i].r,f[i].lazy,f[i].v);
}
int main(){
	scanf("%d%d",&n,&m);build(1,1,n);
	while(m--){
		int c,a,b;scanf("%d%d%d",&c,&a,&b);
		if(c)  printf("%d\n",getsum(1,a,b));
		else change(1,a,b);
		//ts();
	}
	return 0;
}

(一天没有AC了)

2021/7/7 22:20
加载中...