线段树求助
查看原帖
线段树求助
751417
diamond_153楼主2022/12/31 15:20

只过了#1,#3,#4,其他全部TLE,求助

#include<iostream>
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
#define min(x,y) ((x)<(y)?(x):(y))
#define int long long
using namespace std;
struct node{
	int data,add,min;
	int l,r;
}tree[800000];
int seq[300100],n,m;//数组开小了O2会RE
const int inf=(int)(114514*191981.0)<<1;//homo特有的无孔不入(
int build(int p,int l,int r){
	node &root=tree[p];
	root.l=l,root.r=r;
	if(l==r)return root.data=root.min=seq[l];
	int mid=(l+r)>>1;
	root.data=build(ls(p),l,mid)+build(rs(p),mid+1,r);
	root.min=min(tree[ls(p)].min,tree[rs(p)].min);
	return root.data;
}//建树
void down(int p){
	if(!tree[p].add)return;
	tree[ls(p)].add+=tree[p].add;
	tree[rs(p)].add+=tree[p].add;
	tree[ls(p)].data+=tree[p].add*(tree[ls(p)].r-tree[ls(p)].l+1);
	tree[rs(p)].data+=tree[p].add*(tree[rs(p)].r-tree[rs(p)].l+1);
	tree[ls(p)].min+=tree[p].add;
	tree[rs(p)].min+=tree[p].add;
	tree[p].add=0;
}//下传
void add(int l,int r,int val,int p=1){
	if(tree[p].l>r||tree[p].r<l)return;
	if(tree[p].l>=l&&tree[p].r<=r){
		tree[p].data+=val*(tree[p].r-tree[p].l+1);
		tree[p].min+=val;
		tree[p].add+=val;
		return;
	}
	down(p);
	add(l,r,val,ls(p));
	add(l,r,val,rs(p));
	tree[p].data=tree[ls(p)].data+tree[rs(p)].data;
	tree[p].min=min(tree[ls(p)].min,tree[rs(p)].min);
}//添加
int query_sum(int l,int r,int p=1){
	if(tree[p].l>r||tree[p].r<l)return 0;
	if(tree[p].l>=l&&tree[p].r<=r)
		return tree[p].data;
	down(p);
	return query_sum(l,r,ls(p))+query_sum(l,r,rs(p));
}//求和
int query_min(int l,int r,int p=1){
	if(tree[p].l>r||tree[p].r<l)return inf;
	if(tree[p].l>=l&&tree[p].r<=r)
		return tree[p].min;
	down(p);
	return min(query_min(l,r,ls(p)),query_min(l,r,rs(p)));
}//求最小值
signed main(){
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
		cin>>seq[i];
	build(1,1,n);
	while(m--){
		char c;cin>>c;
		int x,y;cin>>x>>y;
		switch(c){
			case 'P':{
				int val;cin>>val;
				add(x,y,val);
				break;
			}
			case 'M':{
				cout<<query_min(x,y)<<endl;
				break;
			}
			case 'S':{
				cout<<query_sum(x,y)<<endl;
				break;
			}
		}
	}
}
2022/12/31 15:20
加载中...