题目链接: 传送门

敌兵布阵

Time Limit: 2000MS     Memory Limit: 32768 K

Description

C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。中央情报局要研究敌人究竟演习什么战术,所以Tidy要随时向Derek汇报某一段连续的工兵营地一共有多少人,例如Derek问:“Tidy,马上汇报第3个营地到第10个营地共有多少人!”Tidy就要马上开始计算这一段的总人数并汇报。但敌兵营地的人数经常变动,而Derek每次询问的段都不一样,所以Tidy不得不每次都一个一个营地的去数,很快就精疲力尽了,Derek对Tidy的计算速度越来越不满:"你个死肥仔,算得这么慢,我炒你鱿鱼!”Tidy想:“你自己来算算看,这可真是一项累人的工作!我恨不得你炒我鱿鱼呢!”无奈之下,Tidy只好打电话向计算机专家Windbreaker求救,Windbreaker说:“死肥仔,叫你平时做多点acm题和看多点算法书,现在尝到苦果了吧!”Tidy说:"我知错了。。。"但Windbreaker已经挂掉电话了。Tidy很苦恼,这么算他真的会崩溃的,聪明的读者,你能写个程序帮他完成这项工作吗?不过如果你的程序效率不够高的话,Tidy还是会受到Derek的责骂的.

Input

第一行一个整数T,表示有T组数据。每组数据第一行一个正整数N(N

Output

对第i组数据,首先输出“Case i:”和回车,对于每个Query询问,输出一个整数并回车,表示询问的段中的总人数,这个数保持在int以内。

Sample Input

1
10
1 2 3 4 5 6 7 8 9 10
Query 1 3
Add 3 6
Query 2 7
Sub 10 2
Add 6 3
Query 3 10
End 

Sample Output

Case 1:
6
33
59
#include <cstdio>
#include<iostream>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 55555;
int sum[maxn<<2];
void PushUP(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 m = (l + r) >> 1;
    build(lson);
    build(rson);
    PushUP(rt);
}
void update(int p,int add,int l,int r,int rt)
{
    if (l == r)
    {
        sum[rt] += add;
        return ;
    }
    int m = (l + r) >> 1;
    if (p <= m) update(p , add , lson);
    else update(p , add , rson);
    PushUP(rt);
}
int query(int L,int R,int l,int r,int rt)
{
    if (L <= l && r <= R)
    {
        return sum[rt];
    }
    int m = (l + r) >> 1;
    int ret = 0;
    if (L <= m) ret += query(L , R , lson);
    if (R > m) ret += query(L , R , rson);
    return ret;
}
int main()
{
    int T , n;
    scanf("%d",&T);
    for (int cas = 1 ; cas <= T ; cas ++)
    {
        printf("Case %d:\n",cas);
        scanf("%d",&n);
        build(1 , n , 1);
        char op[10];
        while (scanf("%s",op))
        {
            if (op[0] == 'E') break;
            int a , b;
            scanf("%d%d",&a,&b);
            if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1));
            else if (op[0] == 'S') update(a , -b , 1 , n , 1);
            else update(a , b , 1 , n , 1);
        }
    }
    return 0;
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxx = 50005;
struct Node{
    int left,right,sum;
};
int ans[maxx];
Node tree[maxx<<2];

void build(int left,int right,int t)
{
    tree[t].left = left;
    tree[t].right = right;
    if (left == right)
    {
        tree[t].sum = ans[right];
        return;
    }

    int mid = (left+right)>>1;
    build(left,mid,t<<1);
    build(mid+1,right,t<<1|1);
    tree[t].sum = tree[t<<1].sum + tree[t<<1|1].sum;
}

int qry(int left,int right,int t)
{

    if (tree[t].left == left && tree[t].right == right) return tree[t].sum;
    int mid = (tree[t].left + tree[t].right) >> 1;
    if (right <= mid)    return qry(left,right,t<<1);
    else if (left > mid)    return qry(left,right,t<<1|1);
    else return qry(left,mid,t<<1) + qry(mid+1,right,t<<1|1);
}

void upd(int id,int add,int t)
{
    if (tree[t].left == tree[t].right)
    {
        tree[t].sum += add;
        return;
    }
    else
    {
        tree[t].sum += add;
        if(id <= tree[t<<1].right)upd(id,add,t<<1);
        else upd(id,add,t<<1|1);
    }
}

int main()
{
    int T,cnt = 1;
    scanf("%d",&T);
    while (T--)
    {
        int N;
        char str[5];
        memset(str,0,sizeof(str));
        memset(ans,0,sizeof(ans));
        memset(tree,0,sizeof(tree));
        scanf("%d",&N);
        for (int i = 1;i <= N;i++)
        {
            scanf("%d",&ans[i]);
        }
        build(1,N,1);
        printf("Case %d:\n",cnt++);
        while (~scanf("%s",str))
        {
            if(str[0] == 'E')   break;
            int x,y;
            scanf("%d%d",&x,&y);
            if (str[0] == 'Q')
            {
                printf("%d\n",qry(x,y,1));
            }
            if (str[0] == 'A')
            {
                upd(x,y,1);
            }
            if (str[0] == 'S')
            {
                upd(x,-y,1);
            }
        }
    }
    return 0;
} 

HDU 1166 敌兵布阵(线段树模板题)的更多相关文章

  1. hdu 1166敌兵布阵(线段树入门题)

    >>点击进入原题测试<< 思路:这两天在学线段树,这个题直接手敲一下线段树就行了,都没有用上懒人标记.入门题 cin,cout会超时,记得加std::ios::sync_wit ...

  2. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  3. hdu 1166 敌兵布阵 线段树 点更新

    // hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...

  4. HDU 1166 敌兵布阵(线段树单点更新,板子题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  5. HDU 1166 敌兵布阵(线段树单点更新)

    敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...

  6. hdu 1166 敌兵布阵(线段树,树状数组)

    http://acm.hdu.edu.cn/showproblem.php?pid=1166 直接线段树模板 AC代码: #include<iostream> #include<cs ...

  7. HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

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

    敌兵布阵Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  10. hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题

    题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...

随机推荐

  1. Python2.2-原理之类型和运算

    此节来自于<Python学习手册第四版>第二部分 一.Python对象类型(第4章) 1. Python可以分解成模块.语句.表达式以及对象:1.程序由模块构成:2.模块包含语句:3.语句 ...

  2. 别再迷信 zepto 了

    希望网上公开课的老师们不要再讲移动端网页用zepto了,坑了无数鸟啊 ~~~. 1.自己/公司/项目组所写和所积累(网上下的)的js函数都是以jQuery插件的写法来写的,如果要换到zepto上的话那 ...

  3. 从B 树、B+ 树、B* 树谈到R 树

    从B 树.B+ 树.B* 树谈到R 树 作者:July.weedge.Frankie.编程艺术室出品. 说明:本文从B树开始谈起,然后论述B+树.B*树,最后谈到R 树.其中B树.B+树及B*树部分由 ...

  4. android服务之MP3播放(2)

    该播放器将会直接从网络上获取资源进行播放,并提供进度条显示的功能 布局文件 布局文件中使用Seekbar组件来显示进度条 <?xml version="1.0" encodi ...

  5. cmd 下telnet 不是内部或外部命令

    问题:cmd 下telnet 提示不是内部或外部命令 解决方案:

  6. OKhttp初步

    OkHttp 使用方法:1.分为同步和异步.同步:1.getRequest request = new Request.Builder().url(utl).build();Response resp ...

  7. re模块(正则表达式)

    re 模块:正则表达式import re 内置模块: 1> re.match(pattern,string) pattern:就是正则表达式 string:被操作的对象 match,search ...

  8. [转]Hibernate update和saveOrUpdate详解

    原文地址:http://www.iteye.com/topic/2712 先来点概念: 在Hibernate中,最核心的概念就是对PO的状态管理.一个PO有三种状态: 1.未被持久化的VO 此时就是一 ...

  9. 数组的方法 Array.map();Array.every()和Array.some();数组的indexof();检测是否是数组isArray(obj);

    数组的方法 Array.map(); 栗子: var a=[1,2,,3]; var b=a.map( function(value){return value*value} ); alert(b); ...

  10. linux命令巧用,随手记

    巧用1 一句话修改或者给用户设置密码,并且防止历史命令记住设置的密码 echo "qqxde:ioj123"|passwd --stdin Dicky && his ...