蒟蒻求助 样例都过不了
查看原帖
蒟蒻求助 样例都过不了
1037997
_TGWQ12_楼主2023/12/25 23:56
#include<bits/stdc++.h>
typedef long long int ll;
using namespace std;
const int maxn = 1000006;
int a[100005];
struct tree {
	int l,r,lt,rt,w;
	ll qh;
} c[200015];
int n,m;
int za(int l,int r,int v) {
	if(l==r) {
		c[v]=(tree) {
			l,r,-1,-1,0,a[l]
		};
		return a[l];
	}
	c[v]=(tree) {
		l,r,v<<1,(v<<1)|1,0,za(l,(l+r)>>1,v<<1)+za(((l+r)>>1)+1,r,(v<<1)|1)
	};
	return c[v].qh;
}
int he(int v,int L,int R) {
	
	c[v].qh+=(c[v].r-c[v].l+1)*c[v].w;
	c[v<<1].w+=c[v].w,c[(v<<1)|1].w+=c[v].w;
	c[v].w=0;
	if(L<=c[v].l&&R>=c[v].r) {
	return c[v].qh;}
	if((c[v].l<=L&&L<=c[v].r)||(R>=c[v].l&&R<=c[v].r)) {
		return he(v<<1,L,R)+he((v<<1)|1,L,R);
	}
	return 0;
}
void jia(int v,int L,int R,int wi) {
	if(L<=c[v].l&&R>=c[v].r) {
		c[v].w+=wi;
		return ;
	}
	if((c[v].l<=L&&L<=c[v].r)||(R>=c[v].l&&R<=c[v].r)) {

		jia(v<<1,L,R,wi);
		jia((v<<1)|1,L,R,wi);
	}
	return ;
}
void dfs(int v) {
	if(v>=n*2) return ;
	cout<<v<<' '<<c[v].w<<endl;
	dfs(v<<1);
	dfs((v<<1)|1);
}
int t,hl,hr,wi;
int main() {
	cin>>n>>m;
	for(int i=1; i<=n; i++) cin>>a[i];
	za(1,n,1);
/*	for(int i=0;i<n;i++) cout<<c[n+i].qh <<' ';
		
		cout<<'\n';*/
	for(int  i=1; i<=m; i++) {
		cin>>t;
		if(t==1) {
			cin>>hl>>hr>>wi;
			jia(1,hl,hr,wi);
			//dfs(1);
		} else {
			cin>>hl>>hr;
			cout<<'#'<<he(1,hl,hr)<<endl;
		}/*
		for(int i=0;i<n;i++) cout<<c[n+i].qh <<' ';cout<<'\n';*/
	}


	return 0;
}

本蒟蒻刚从深入浅出中看了线段树感觉自己又行了,一回家写到现在,硬是样例都过不了
20一直都是16,

2023/12/25 23:56
加载中...