Hdu1166单点更新线段树

入门线段树,单点更新。写了几遍,都是学着notonlysuccess写的。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>

using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int sum[444444];
void up(int rt)
{
    sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

void build(int l, int r, int rt)
{
    if (l == r){
        scanf("%d", &sum[rt]); return;
    }
    int mid = (l + r) >> 1;
    build(lson);
    build(rson);
    up(rt);
}

void update(int key, int add, int l, int r, int rt)
{
    if (l == r){
        sum[rt] += add; return;
    }
    int mid = (l + r) >> 1;
    if (key <= mid) update(key, add, lson);
    else update(key, add, rson);
    up(rt);
}

int ask(int L, int R, int l, int r, int rt)
{
    if (L <= l&&r <= R) return sum[rt];
    int mid = (l + r) >> 1;
    int ans = 0;
    if (L <= mid) ans += ask(L, R, lson);
    if (R>mid) ans += ask(L, R, rson);
    return ans;
}
char str[100];
int main()
{
    int Icase; int n;
    scanf("%d", &Icase);
    int tt = 0;
    while (Icase--){
        printf("Case %d:\n", ++tt);
        scanf("%d", &n);
        build(1, n, 1);
        for (;;){
            int a; int b;
            scanf("%s", str); if (str[0] == ‘E‘) break; scanf("%d%d", &a, &b);
            if (str[0] == ‘A‘){
                update(a, b, 1, n, 1);
            }
            if (str[0] == ‘S‘){
                update(a, -b, 1, n, 1);
            }
            if (str[0] == ‘Q‘){
                printf("%d\n", ask(a, b, 1, n, 1));
            }
        }
    }
    return 0;
}

Hdu1166单点更新线段树,布布扣,bubuko.com

时间: 2024-11-05 11:54:47

Hdu1166单点更新线段树的相关文章

hdu 1166 敌兵布阵(单点更新线段树)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 54411    Accepted Submission(s): 22830 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

hdu1166 单点更新

第一道线段树,对着学长给的板子敲,嘿嘿,纪念一下~~~ 代码: 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <string.h> 5 #include <cmath> 6 #include <cstdlib> 7 #include <algorithm> 8 9 using namespace std; 10 11 co

【线段树】线段树系列 0.1单点修改单点求和线段树

终于搞定了单点修改线段树...3个月..操蛋..根本没有模板题..觉得太弱了...艹蛋...必须进一步更新我的版本啊 #include<iostream> #include<cstdlib> #include<cstdio> #include<cmath> using namespace std; struct node { int left,right,value; }; node point[100]; int father[100]; int g; v

点更新线段树模板

点更新线段树 对一列数,对每次询问输出对应区间的和,每次修改只修改一个数的值... 定义: 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为其右子树,每次建立子树方法相同,可以递归建树...至于询问,如果询问区间并不是

ZOJ2112 动态区间Kth(单点修改) 线段树+Treap写法

---恢复内容开始--- 题意:给出一个序列和操作次数, 每次操作修改一个位置的数 或者 询问一个区间第k小的数 分析:单点修改可以考虑线段树, 区间排名可以用平衡树 所以线段树+Treap 用一颗线段树将序列划分 每颗Treap中插入的是对应区间的数 在每个数加入时, 顺便将该数插入线段树中包含该位置的那些区间上的Treap即可 单点修改同理, 将所有包含要修改的位置的区间上的Treap都删去原数并插入新数 询问第k小的数:由于询问的区间不一定恰好对应某棵Treap, 不便直接求出名次, 但是

【成端更新线段树模板】POJ3468-A Simple Problem with Integers

http://poj.org/problem?id=3468 _(:зゝ∠)_我又活着回来啦,前段时间太忙了写的题没时间扔上来,以后再说. [问题描述] 成段加某一个值,然后询问区间和. [思路] 讲一下pushdown和pushup出现的几个位置. pushup: (1)build的结尾,当叶子节点分别有对应的值后,它的父亲们就等于它们求和. (2)update的结尾,因为此时当前根的左右孩子已经更新了,故它也需要更新. pushdown(延迟标记): *pushdown会出现在一切要从当前结

HDU1166敌兵布阵(线段树单点更新)

线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度. 使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,因此有时需要离散化让空间压缩. [以下以 求区间最大值为例] 先看声明

线段树入门总结

线段树的入门级 总结   线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点.      对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b].因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度.      使用线段树可以快速的查找某一个节点在若干条线段中出现的次数,时间复杂度为O(logN).而未优化的空间复杂度为2N,因此有时需要离散化让空间

HDU3874 线段树 + 离线处理

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3874 , 线段树(或树状数组) + 离线处理 下午做了第一道离线处理的题目(HDU4417),多少有点感觉,顺便就把这道题也给做了. 这道题就是要求某个区间内不重复数的和,自己在网上百度后参考别人的方法才AC的.参考来源:http://www.cnblogs.com/gj-Acit/p/3249827.html 这道题还是需要先离线处理数据,具体方法: ① 先用线段树把树给建立起来: ② 先把所有要