线段树

C++线段树模版代码

洛谷P3372 【模板】线段树 1

#include<bits/stdc++.h>
#define int long long
#define ls 2*root
#define rs 2*root+1
using namespace std;

const int MAXN = 1e5+10;


int he[5 * MAXN], biao[5 * MAXN], a[5 * MAXN];


void pushup(int root){
	he[root] = he[rs]+he[ls];
}

void build(int root, int l, int r){
	biao[root]=0;
	if(l == r) {
		he[root]=a[l];
		return ;
	} 
	int mid = (l + r) / 2; 
	build(ls, l, mid); 
	build(rs, mid+1, r); 
	pushup(root);
}

void pushdown(int root,int l,int r){
	int mid=(l+r)/2;
	biao[ls]+=biao[root];
	he[ls]+=biao[root]*(mid-l+1);
	biao[rs]+=biao[root];
	he[rs]+=biao[root]*(r-mid);
	biao[root]=0;
}


void update(int root, int l, int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr){
		he[root]+=k*(r-l+1);
		biao[root]+=k;
		return ;
	}
	pushdown(root,l,r);
	int mid=(l+r)/2;
	if(ql<=mid)update(ls,l,mid,ql,qr,k);
	if(qr>mid) update(rs,mid+1,r,ql,qr,k);
	pushup(root);
}

int query(int root, int l, int r, int qx, int qy){
	int ans = 0;
	if (qx <= l && r <= qy) return he[root];
	int mid=(l+r)/2;
	pushdown(root,l,r);
	if (qx <= mid) ans += query(ls, l, mid, qx, qy);
	if (qy > mid) ans += query(rs, mid+1, r, qx, qy);
	return ans;
}

signed main(){
	int n,m;
	cin >> n >> m;
	
	for(int i = 1;i<=n;i++){
		cin >>a[i]; 
	}
	build(1,1,n);
	while(m--){
		char op;
		int a, b,k;
		cin >> op >> a >> b;
		if(a>b)swap(a,b);
		if(op == '1'){
			cin >> k;
			update(1, 1, n, a, b, k);
		}else if(op == '2'){
			cout << query(1, 1, n, a, b)<<'\n';
		}
	}
	return 0; 
} 

Substr Swap

#include<bits/stdc++.h>
#define ls 2*root
#define rs 2*root+1
using namespace std;

const int MAXN = 3e5+10;


int he[5 * MAXN], biao[5 * MAXN], a[5 * MAXN];


void pushup(int root){
	he[root] =( he[rs]+he[ls])%2;
}

void build(int root, int l, int r){
	biao[root]=0;
	if(l == r) {
		he[root]=a[l];
		return ;
	} 
	int mid = (l + r) / 2; 
	build(ls, l, mid); 
	build(rs, mid+1, r); 
	pushup(root);
}

void pushdown(int root,int l,int r){
	int mid=(l+r)/2;
	biao[ls]=(biao[ls]+biao[root])%2;
	he[ls]=(he[ls]+(biao[root]*(mid-l+1))) % 2;
	biao[rs]=(biao[rs]+biao[root])%2;
	he[rs]=(he[rs]+(biao[root]*(r-mid))) % 2;
	biao[root]=0;
}


void update(int root, int l, int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr){
		he[root]=(k*(r-l+1)+he[root])%2;
		biao[root]=(k+biao[root])%2;
		return ;
	}
	pushdown(root,l,r);
	int mid=(l+r)/2;
	if(ql<=mid)update(ls,l,mid,ql,qr,k);
	if(qr>mid) update(rs,mid+1,r,ql,qr,k);
	pushup(root);
}

int query(int root, int l, int r, int qx, int qy){
	int ans = 0;
	if (qx <= l && r <= qy) return he[root];
	int mid=(l+r)/2;
	pushdown(root,l,r);
	if (qx <= mid) ans += query(ls, l, mid, qx, qy);
	if (qy > mid) ans += query(rs, mid+1, r, qx, qy);
	return ans;
}

signed main(){
	int n,m;
	cin >> n >> m;
	
	string s1,s2;
	cin >> s1>>s2;
	
	build(1,1,n);
	for(int i = 1;i<=m;i++){
		int a, b;
		cin>> a>>b;
		update(1,1,n,a,b,1);
	}
	for(int i = 1;i<=n;i++){
		int k=query(1,1,n,i,i);
		if(k==1){
			cout<<s2[i-1];
		}else{
			cout<<s1[i-1];
		}
	}
	puts("");
	return 0; 
} 
posted @ 2025-09-11 13:58  Aa761028  阅读(10)  评论(2)    收藏  举报