POJ-3468 A Simple Problem with Integers

来源:互联网 发布:淘宝怎样识别死人衣服 编辑:程序博客网 时间:2024/05/20 17:41

题目链接:https://vjudge.net/problem/POJ-3468

用线段树解决,成段更新时要使用懒惰标记加速

#include<iostream>#include<cstdio>#include<cstring> #include<algorithm>#include<cmath>typedef long long ll;#define maxn 100010struct node{    int l, r;ll sum;    int mid(){        return (l+r)>>1;    }};node Tree[maxn<<2];ll value[maxn+10]; //从 1 开始赋值 ll vis[maxn<<2];//初始化树,根节点是1void init_tree(int root, int l, int r){    Tree[root].l = l;    Tree[root].r = r;    vis[root]=0;    if(l == r)        Tree[root].sum = value[l];    else{        init_tree(root<<1, l, (l+r)>>1);        init_tree((root<<1)+1, ((l+r)>>1) + 1, r);        Tree[root].sum = Tree[root<<1].sum + Tree[(root<<1)+1].sum;    }}void pushdown(int rt,int m){if(vis[rt]){vis[rt<<1]+=vis[rt];vis[rt<<1|1]+=vis[rt];Tree[rt<<1].sum+=(ll)(vis[rt])*(m-(m>>1));Tree[rt<<1|1].sum+=(ll)(vis[rt])*(m>>1);vis[rt]=0;}}//查找和ll query_tree(int root, int l, int r){    int m = Tree[root].mid();    if(l == Tree[root].l && r == Tree[root].r)        return Tree[root].sum;        pushdown(root,Tree[root].r-Tree[root].l+1);        if(l > m)            return query_tree((root<<1)+1, l, r);        else if(r <= m)            return query_tree(root<<1, l, r);        else            return query_tree(root<<1, l, m) + query_tree((root<<1)+1, m+1, r);}void update_tree(int root, int l, int r, int v){    if(Tree[root].l ==l&& Tree[root].r==r)    {    vis[root]+=v;    Tree[root].sum+=ll(r-l+1)*v;    return;    }    pushdown(root,Tree[root].r-Tree[root].l+1);int m = Tree[root].mid();    if(l > m)    update_tree((root<<1)+1, l, r, v);    else if(r <= m)    update_tree(root<<1, l, r, v);    else    {       update_tree((root<<1)+1, m+1, r, v);       update_tree(root<<1, l, m, v);}Tree[root].sum = Tree[root<<1].sum+Tree[root<<1|1].sum;}int main(){int n,m;while(~scanf("%d%d",&n,&m)){for(int i=1;i<=n;i++)scanf("%lld",&value[i]);init_tree(1,1,n);int a,b,v;char c[5];for(int i=0;i<m;i++){scanf("%s",c);if(c[0]=='C'){scanf("%d%d%d",&a,&b,&v);update_tree(1,a,b,v);}else{scanf("%d%d",&a,&b);printf("%lld\n",query_tree(1,a,b));}} }return 0;}

原创粉丝点击