线段树 一个单独的数加上或减去某个数字 最后一段求和

#include<vector>
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<math.h>
using namespace std;
#define INF 0x3f3f3f3f
#define N 60022
#define lson rood<<1
#define rson rood<<1|1
int w[N];
struct node
{
    int l,r,v,mid;
}a[N<<2];
void q(int rood,int l,int r)
{
    a[rood].l=l;a[rood].r=r;a[rood].mid=(r+l)/2;
    if(l==r)
    {
        a[rood].v=w[l];
        return ;
    }
    q(lson,l,a[rood].mid);
    q(rson,a[rood].mid+1,r);
    a[rood].v=a[lson].v+a[rson].v;
}
void qq(int rood,int e,int f)
{
    a[rood].v+=f;
    if(a[rood].r==a[rood].l) return ;
    if(a[rood].mid>=e) qq(lson,e,f);
    else qq(rson,e,f);
}
int Q(int rood,int l,int r)
{
    if(a[rood].l==l&&a[rood].r==r)
        return a[rood].v;
    if(a[rood].mid>=r) return Q(lson,l,r);
    else if(a[rood].mid<l) return Q(rson,l,r);
    else
    {
        int x=Q(lson,l,a[rood].mid);
        int y=Q(rson,a[rood].mid+1,r);
        return x+y;
    }
}

int main()
{
    int T,i,e,f,n,t=1;
    char str[30];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&w[i]);
        q(1,1,n);
        printf("Case %d:\n",t++);
        while(scanf("%s",str),strcmp(str,"End"))
        {
            scanf("%d%d",&e,&f);
            if(str[0]==‘Q‘)
            {
                printf("%d\n",Q(1,e,f));
                continue;
            }
            int ans=1;
            if(str[0]==‘S‘)
                ans*=-1;
            f*=ans;
            qq(1,e,f);
        }
    }
    return 0;
}

http://acm.hdu.edu.cn/showproblem.php?pid=1166

时间: 2024-10-11 07:13:15

线段树 一个单独的数加上或减去某个数字 最后一段求和的相关文章

【C语言】在两个数成对出现的数组中找到一个单独的数。

//在两个数成对出现的数组中找到一个单独的数.比如{1,2,3.3,1,4.2},即找出4 #include <stdio.h> int find(int arr[], int len) { int i = 0; int ret = 0; for (i = 0; i < len; i++) { ret = ret^arr[i]; } return ret; } int main() { int arr1[] = { 1, 2, 2, 3, 1, 5, 3 }; int arr2[] =

(c) hdu1394* (求逆序对数)(线段树)

(c) hdu1394 如在阅读本文时遇到不懂的部分,请在评论区询问,或跳转 线段树总介绍 线段树求逆序对数比较少见啊(归并排序多快啊...但是本文是讲解线段树写法...),何况这题还加了点别的玩意儿... 1. 本来这种题目要离散化的,可是体中保证了数列0~n-1. 2. 每次把首位放到最末,显然不能 每次都求逆序对 ,于是又到了推 倒 导时间. 由 a1 a2 ... an 变为 a2 a3 ... an a1 减少的逆序对数为 a2~an中比a1小的数的个数 增加的逆序对数为 a2~a1中

线段树(二)

转自:http://blog.csdn.net/liujian20150808/article/details/51137749 1.线段树的定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度. 举例描述: 因此有了以上对线段树的定

线段树练习 1,2

题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或者减去一个特定的值A.现在要求你能对每个提问作出正确的回答.1≤N<100000,,提问和修改的总数m<10000条. 输入描述 Input Description 输入文件第一行为一个整数N,接下来是n行n个整数,表示格子中原来的整数.接下一个正整数m,再接下来有m行,表示m个询问,第一个整数表

codevs 1080 线段树练习--用树状数组做的

1080 线段树练习 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或者减去一个特定的值A.现在要求你能对每个提问作出正确的回答.1≤N<100000,,提问和修改的总数m<10000条. 输入描述 Input Description 输入文件第一行为一个整

【bzoj2770】YY的Treap 权值线段树

题目描述 志向远大的YY小朋友在学完快速排序之后决定学习平衡树,左思右想再加上SY的教唆,YY决定学习Treap.友爱教教父SY如砍瓜切菜般教会了YY小朋友Treap(一种平衡树,通过对每个节点随机分配一个priority,同时保证这棵平衡树关于priority是一个小根堆以保证效率).这时候不怎么友爱的510跑了出来,他问了YY小朋友一个极不和谐的问题:怎么求Treap中两个点之间的路径长度.YY秒了之后决定把这个问题交给你来做,但只要求出树中两点的LCA. 输入 第一行两个整数n,m 第二行

点更新线段树模板

点更新线段树 对一列数,对每次询问输出对应区间的和,每次修改只修改一个数的值... 定义: struct tree { int l,r;//记录代表的区间 int sum;//代表区间的和 } 由于线段树还是相对比较平衡的,所以可以使用数组t来存储这棵树,对与某个节点i,t[i*2]就是左子树,t[i*2+1]就是右子树建树:线段树的思想是每个节点记录区间的信息,某点区间1~n,则1~n/2为其左子树,n/2+1~n为其右子树,每次建立子树方法相同,可以递归建树...至于询问,如果询问区间并不是

线段树&#183;题解报告

线段树·题解报告 参考资料 ·课件 线段树 --刘汝佳 统计的力量,线段树全接触 --张昆玮 ·Blog [完全版]线段树 从普通线段树到zkw线段树 [总结][数据结构]ZKW线段树详解 选题目录 · Hdu1166 敌兵布阵(单点更新,区间求和) · Hdu1754 I Hate It(单点更新,RMQ) · Hdu3308 LCIS(单点更新,区间并) · Poj3468 A Simple Problem with Integers(区间加减,区间求和) · Poj2777 Count C

不可能数据结构(线段树+思维+找规律)

不可能数据结构 Description造一道数据结构题是一件很累的事情.即使是有了坚固的数据结构造题程式,出题人仍然不能够一劳永逸.问题大概出在,造题程式并不总能生成对的题.比如,造题程式无意产生了一道出题人认为不可做题,这便成了一道错题.嘛,出了错题,其实也是没有关系的.出题人可以拿着暴力程序跑一个星期来跑出所需要的测试数据.一个星期跑不出来就延期一个星期机考好了,至于算法和讲题嘛,也就看看现场ac代码现学现卖咯?可能对你们来说很不幸的现实是,这道题似乎是个错题.给你一个初始n个元素的序列,有