社区讨论

线段树10分求调

P3368【模板】树状数组 2参与者 2已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@m2fkbzpd
此快照首次捕获于
2024/10/19 10:51
去年
此快照最后确认于
2025/11/04 16:52
4 个月前
查看原帖

10分代码:(样例是对的)

CPP
#include<bits/stdc++.h>
using namespace std;

struct node{
	long long l;
	long long r;
	long long f;
	long long w;
}tree[5000005];

inline void build(long long k,long long ll,long long rr){
	tree[k].l=ll;
	tree[k].r=rr;
	if(tree[k].l==tree[k].r){
		cin>>tree[k].w;
		return ;
	}
	long long mid=(tree[k].l+tree[k].r)/2;
	build(2*k,ll,mid);
	build(2*k+1,mid+1,rr);
	tree[k].w=tree[2*k].w+tree[2*k+1].w;
}

inline void down(long long k) {
	tree[2*k].f+=tree[k].f;
	tree[2*k+1].f+=tree[k].f;
	tree[2*k].w+=tree[k].f*(tree[2*k].r-tree[2*k].l+1);
	tree[2*k+1].w=tree[k].f*(tree[2*k+1].r-tree[2*k+1].l+1);
	tree[k].f=0;
}

inline void change_interval(long long k,long long x,long long y,long long add){
	if(x<=tree[k].l && y>=tree[k].r) {
		tree[k].w+=add*(tree[k].r-tree[k].l+1);
		tree[k].f+=add;
		return ;
	}
	if(tree[k].f) {
		down(k);
	}
	long long mid=(tree[k].l+tree[k].r)/2;
	if(x<=mid) {
		change_interval(2*k,x,y,add);
	}
	if(y>mid) {
		change_interval(2*k+1,x,y,add);
	}
	tree[k].w=tree[2*k].w+tree[2*k+1].w;
}

inline long long ask_point(long long k,long long x){
	if(tree[k].l==tree[k].r){
		return tree[k].w;
	}
	if(tree[k].f) {
		down(k);
	}
	long long mid=(tree[k].l+tree[k].r)/2;
	if(x<=mid){
		return ask_point(2*k,x);
	}
	else{
		return ask_point(2*k+1,x);
	}
}

int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	long long n,m;
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++){
		long long op;
		cin>>op;
		if(op==1){
			long long x,y,k;
			cin>>x>>y>>k;
			change_interval(1,x,y,k);
		}
		else{
			long long x;
			cin>>x;
			cout<<ask_point(1,x)<<"\n";
		}
	}
	return 0;
}

求调

回复

3 条回复,欢迎继续交流。

正在加载回复...