社区讨论

求助线段树

学术版参与者 3已保存回复 2

讨论操作

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

当前回复
2 条
当前快照
1 份
快照标识符
@lymxwkoh
此快照首次捕获于
2024/07/15 20:07
2 年前
此快照最后确认于
2024/07/15 20:57
2 年前
查看原帖

题目

不知道为啥数不出来

大佬帮帮我orz

(玄关)
CPP
#include<bits/stdc++.h>
using namespace std;
template<typename T> void read(T&x){
	int sign=1;x=0;
	char c;
	do{
		c=getchar();
		if(c=='-') sign=-1;
	}while(!isdigit(c));
	do{
		x=x*10+c-'0';
		c=getchar();
	}while(isdigit(c));
	x*=sign;
}
int n,m;
const int N=1e5+100;
int a[N*4],ans[N*4];
int w[N << 2],lzy[N << 2];
void build(int id,int l,int r)
{
	if(l == r)
	{
		ans[id] = a[l];
		return;
	}
	int mid = l + r >> 1;
//	int mid = (l + r) / 2;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	//w[id] = w[id<<1]+w[id<<1|1];
}
void update(int id,int l,int r,int L,int R,int head,int cha,int k){
	if(l==L&&R==r&&k<=R-L+1&&k>=0){
		ans[id]+=head+cha*k;
		return ;
	}
	int mid=(l+r)/2;
	if(R<=mid) update(id*2,l,mid,L,R,head,cha,k-1);
	else update(id*2+1,mid+1,r,L,R,head,cha,k-1); 
}
int find (int id,int l,int r,int p){
	if(l==r){
		return ans[id];
	}
	int mid=(l+r)/2;
	if(p<=mid) return find(id*2,l,mid,p);
	else  return find(id*2+1,mid+1,r,p);
}
int main(){
 read(n); read(m);
	for(int i=1;i<=n;i++){
		read(a[i]);
	}
	while(m--){
		int opt;read(opt) ;
		if(opt==1){
			int l;read(l);int r;read(r);int k;read(k);int d;read(d);
			update(1,1,n,l,r,k,d,r-l+1);
		}
		else{
			int p;read(p);
	       cout<<find(1,1,n,p)<<'\n';		
		}
	}
	return 0; 
}

初学线段树就卡我一小时qwq

回复

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

正在加载回复...