敌兵布阵

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 128380    Accepted Submission(s): 53795

Problem 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<=50000),表示敌人有N个工兵营地,接下来有N个正整数,第i个正整数ai代表第i个工兵营地里开始时有ai个人(1<=ai<=50)。

接下来每行有一条命令,命令有4种形式:

(1) Add i j,i和j为正整数,表示第i个营地增加j个人(j不超过30)

(2)Sub i j ,i和j为正整数,表示第i个营地减少j个人(j不超过30);

(3)Query i j ,i和j为正整数,i<=j,表示询问第i到第j个营地的总人数;

(4)End 表示结束,这条命令在每组数据最后出现;

每组数据最多有40000条命令

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

线段树和树状数组模板题

  1. /****树状数组****/
  2. #include<iostream>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. int a[50055];
  7. int c[50055];
  8. int lowbit(int x){
  9. return x&-x;
  10. }
  11. void add(int x,int val){
  12. while(x<50055){
  13. c[x]+=val;
  14. x+=lowbit(x);
  15. }
  16. }
  17. int sum(int x){
  18. int sum=0;
  19. while(x>0){
  20. sum+=c[x];
  21. x-=lowbit(x);
  22. }
  23. return sum;
  24. }
  25. int main()
  26. {
  27. int T,n,x,y;
  28. char s[6];
  29. scanf("%d",&T);
  30. for(int k=1;k<=T;k++)
  31. {
  32. printf("Case %d:\n",k);
  33. memset(c,0,sizeof(c));
  34. scanf("%d",&n);
  35. for(int i=1;i<=n;i++)
  36. scanf("%d",&x),add(i,x);
  37. while(scanf("%s",s)){
  38. if(s[0]=='E')
  39. break;
  40. else if(s[0]=='A'){
  41. scanf("%d%d",&x,&y);
  42. add(x,y);
  43. }
  44. else if(s[0]=='S'){
  45. scanf("%d%d",&x,&y);
  46. add(x,-y);
  47. }
  48. else if(s[0]=='Q'){
  49. scanf("%d%d", &x,&y);
  50. printf("%d\n",sum(y)-sum(x-1));
  51. }
  52. }
  53. }
  54. return 0;
  55. }
  1. /****线段树****/
  2. #include<iostream>
  3. #include<string.h>
  4. #include<algorithm>
  5. using namespace std;
  6. struct node{
  7. int x,y,val;
  8. } q[333333];
  9. void pushup(int rt){
  10. q[rt].val=q[rt<<1].val+q[rt<<1|1].val;
  11. }
  12. void build(int rt,int x,int y){
  13. q[rt].x=x,q[rt].y=y;
  14. if(x==y){
  15. scanf("%d",&q[rt].val);
  16. return ;
  17. }
  18. int m=x+y>>1;
  19. build(rt<<1,x,m);
  20. build(rt<<1|1,m+1,y);
  21. pushup(rt);
  22. }
  23. void update(int rt,int x,int val){
  24. if(q[rt].x==q[rt].y){
  25. q[rt].val+=val;
  26. return;
  27. }
  28. int m=q[rt].x+q[rt].y>>1;
  29. if(x<=m)
  30. update(rt<<1,x,val);
  31. else if(x>m)
  32. update(rt<<1|1,x,val);
  33. pushup(rt);
  34. }
  35. int query(int rt,int x,int y){
  36. if(x<=q[rt].x&&y>=q[rt].y){
  37. return q[rt].val;
  38. }
  39. int ans=0,m=q[rt].x+q[rt].y>>1;
  40. if(x<=m)
  41. ans+=query(rt<<1,x,y);
  42. if(y>m)
  43. ans+=query(rt<<1|1,x,y);
  44. return ans;
  45. }
  46. int main()
  47. {
  48. int T,n,x,y;
  49. char s[6];
  50. scanf("%d",&T);
  51. for(int k=1;k<=T;k++)
  52. {
  53. printf("Case %d:\n",k);
  54. scanf("%d",&n);
  55. build(1,1,n);
  56. while(scanf("%s",s)){
  57. if(s[0]=='E')
  58. break;
  59. else if(s[0]=='A'){
  60. scanf("%d%d",&x,&y);
  61. update(1,x,y);
  62. }
  63. else if(s[0]=='S'){
  64. scanf("%d%d",&x,&y);
  65. update(1,x,-y);
  66. }
  67. else if(s[0]=='Q'){
  68. scanf("%d%d", &x,&y);
  69. printf("%d\n",query(1,x,y));
  70. }
  71. }
  72. }
  73. return 0;
  74. }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. HDU 1166 敌兵布阵 线段树

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

  10. HDU 1166 - 敌兵布阵 - [线段树][树状数组]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

随机推荐

  1. Vue -自定义指令&钩子函数

    除了核心功能默认内置的指令,Vue也允许注册自定义指令 页面加载后,让文本框自动获取焦点,原生js做法是获取文本框元素后调用focus()方法,但Vue不建议手动操作DOM元素,所以此时要自定义指令 ...

  2. OGG初始化之使用Oracle Data Pump加载数据

    此方法使用Oracle Data Pump实用程序来建立目标数据.将副本应用于目标后,您将记录副本停止的SCN.包含在副本中的交易将被跳过以避免完整性违规冲突.从流程起点,Oracle GoldenG ...

  3. pytroch 0.3 到 0.4版本迁移资料mark

    搜了一堆,还是官方资料给力,一份中文,一份英文,maek一下 https://www.pytorchtutorial.com/pytorch-0-4-0-migration-guide/ https: ...

  4. wchar_t*转换string

    场景 wchar[]转换string 实现代码 #include "stdafx.h" #include <iostream> #include <windows ...

  5. C# string.join

    String.Join 方法 平常工作中经常用到string.join()方法,在vs 2017用的运行时(System.Runtime, Version=4.2.0.0)中,共有九个(重载)方法. ...

  6. boost 随机数发生器

    Random     随机数 在很多应用中都需要使用随机数.本库力求提供一个高效的,通用的随机数库.boost库有多种随机数生成方式.先熟悉一下各种随机数生成器的概念. 数字生成器(Number Ge ...

  7. 【转】Java finally语句到底是在return之前还是之后执行?

    网上有很多人探讨Java中异常捕获机制try...catch...finally块中的finally语句是不是一定会被执行?很多人都说不是,当然他们的回答是正确的,经过试验,至少有两种情况下final ...

  8. 鸟哥Linux私房菜基础学习篇学习笔记2

    鸟哥Linux私房菜基础学习篇学习笔记2 第九章 文件与文件系统的压缩打包: Linux下的扩展名没有什么特殊的意义,仅为了方便记忆. 压缩文件的扩展名一般为: *.tar, *.tar.gz, *. ...

  9. ubuntu安装pycharm并建立桌面快捷方式

    环境:ubuntu18.04 参考文章:本地安装:https://blog.csdn.net/liuxiao214/article/details/78893457 在线安装:https://www. ...

  10. js 正则提取img标签的src值

    var r = '<img[^<>]*? src="([^<>]*?)"'; var yyy=content.match(r); alert(yyy[ ...