求调线段树(过样例但是0分)
查看原帖
求调线段树(过样例但是0分)
855707
charmyy楼主2024/5/3 22:12
// Problem: P3372 【模板】线段树 1
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3372
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)
 
#include<bits/stdc++.h>
using namespace std;
 
typedef long long ll;
 
const int N = 2e5+5;
 
int n,q;
int a[N];
 
struct node{
	ll l,r,val,sz;
}seg[N*4];
 

void update(int id){
	seg[id].val=seg[id*2].val+seg[id*2+1].val;
}

void settag(int id){
	seg[id].val=seg[id].r-seg[id].l+1-seg[id].val;
	seg[id].sz^=1;
}
 
void pushdown(int id){
	if(seg[id].sz!=0){  
		settag(id*2);
		settag(id*2+1);
		seg[id].sz=0;
	}
}

void build(int id,int l,int r){
	seg[id].sz=r-l+1;
	if(l==r){
		seg[id].val={a[l]};
	}
	else{
		int mid=(l+r)/2;
		build(id*2,l,mid);
		build(id*2+1,mid+1,r);
		update(id);
	}
}

void modify(int id,int l,int r,int ql,int qr){
	if(l==ql&&r==qr){
		settag(id);
		return;
	}
	int mid=(l+r)/2;
	pushdown(id);
	if(qr<=mid){
		modify(id*2,l,mid,ql,qr);
	}
	else if(ql>mid){
		modify(id*2+1,mid+1,r,ql,qr);
	}
	else{
		modify(id*2,l,mid,ql,mid);
		modify(id*2+1,mid+1,r,mid+1,qr);
	}
	update(id);
}
 
ll query(int id,int l,int r,int ql,int qr){
	if(l==ql&&r==qr){
		return seg[id].val;
	}
	int mid=(l+r)/2;
	pushdown(id);
	if(qr<=mid){
		return query(id*2,l,mid,ql,qr);
	}
	else if(ql>mid){
		return query(id*2+1,mid+1,r,ql,qr);
	}
	else{
		return query(id*2,l,mid,ql,mid)+query(id*2+1,mid+1,r,mid+1,qr);
	}
}
 
int main(){
	cin>>n>>q;
	// for(int i=1;i<=n;i++){
		// a[i]=0;
	// }
	// build(1,1,n);
	for(int i=0;i<q;i++){
		int ty;
		cin>>ty;
		if(ty==0){
			int l,r;
			cin>>l>>r;
			modify(1,1,n,l,r);
		}
		else{
			int l,r;
			cin>>l>>r;
			cout<<query(1,1,n,l,r)<<"\n";
		}
	}
 
	
	return 0;	
 
}
2024/5/3 22:12
加载中...