POJ 3468 A Simple Problem with Integers----线段树
  VrZI4Uwu8BR1 2023年11月02日 64 0


第一次写线段树啊,当模板用的以后。。。



#include<iostream>
using namespace std;

struct node{
	node *pleft,*pright;
	int L,R;
	long long lnc;
	long long nsum;
};
node tree[1000000];

int ncount=0;
int mid(node *p)
{
	return (p->L+p->R)/2;
}
void buildtree(node *p,int a,int b)
{
	 p->L=a;
	 p->R=b;
	 p->lnc=0;
	 p->nsum=0;
	 if(a==b) return ;
	 ncount++;
	 p->pleft=ncount+tree;
	 ncount++;
	 p->pright=ncount+tree;
	 buildtree(p->pleft,a,(a+b)/2);
	 buildtree(p->pright,(a+b)/2+1,b);
}

void insert(node *p,int i,int a)
{
	if(p->L==i && p->R==i)
	{
		p->nsum=a;
		return ;
	}
	p->nsum+=a;
	if(i<=mid(p))
		insert(p->pleft,i,a);
	else
		insert(p->pright,i,a);
}

void add(node *p,int a,int b,long long c)
{
	if(p->L==a && p->R==b){
		p->lnc+=c;
		return ;
	}
	p->nsum+=(b-a+1)*c;
	if(a>=mid(p)+1)
		add(p->pright,a,b,c);
	else if(b<=mid(p))
		add(p->pleft,a,b,c);
	else
	{
		add(p->pleft,a,mid(p),c);
		add(p->pright,mid(p)+1,b,c);
	}
}
long long quiry(node *p,int a,int b)
{
	if(p->L==a && p->R==b){
		return p->nsum+(p->R-p->L+1)*p->lnc;
	}
	p->nsum+=(p->R-p->L+1)*p->lnc;
	add(p->pleft,p->L,mid(p),p->lnc);
	add(p->pright,mid(p)+1,p->R,p->lnc);
	p->lnc=0;
	if(b<=mid(p))
		return quiry(p->pleft,a,b);
	else if(a>=mid(p)+1)
		return quiry(p->pright,a,b);
	else{
		return quiry(p->pleft,a,mid(p))+quiry(p->pright,mid(p)+1,b);
	}
}
int main()
{
	int i,j,k;
	int n,q;
	char ch[10];
	int a,b,c;
	scanf("%d%d",&n,&q);
	ncount=0;
	buildtree(tree,1,n);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&a);
		insert(tree,i,a);
	}
	for(i=0;i<q;i++){
		scanf("%s",ch);
		if(ch[0]=='C'){
			scanf("%d%d%d",&a,&b,&c);
			add(tree,a,b,c);
		}
		else{
			scanf("%d%d",&a,&b);
			printf("%I64d\n",quiry(tree,a,b));
		}
	}
	return 0;
}





【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
VrZI4Uwu8BR1