敌兵布阵

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

Total Submission(s): 59427    Accepted Submission(s): 25098

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. 1
  2. 10
  3. 1 2 3 4 5 6 7 8 9 10
  4. Query 1 3
  5. Add 3 6
  6. Query 2 7
  7. Sub 10 2
  8. Add 6 3
  9. Query 3 10
  10. End
 
Sample Output
  1. Case 1:
  2. 6
  3. 33
  4. 59
 
Author
Windbreaker
 
Recommend
 

Statistic | Submit | 

problemid=1166" style="color:rgb(26,92,200); text-decoration:none">Discuss | Note

线段树。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <algorithm>
  4. using namespace std;
  5. struct node
  6. {
  7. int left,right,val;
  8. }c[50000*3];
  9. void build_tree(int l,int r,int root)//建树
  10. {
  11. c[root].left=l;
  12. c[root].right=r;
  13. if(l==r)
  14. {
  15. scanf("%d",&c[root].val);
  16. return ;
  17. }
  18. int mid=(c[root].left+c[root].right)/2;
  19. build_tree(l,mid,root*2);
  20. build_tree(mid+1,r,root*2+1);
  21. c[root].val=c[root*2].val+c[root*2+1].val;
  22. }
  23. void search_tree(int l,int r,int root,int &sum)//计算和
  24. {
  25. if(c[root].left==l&&c[root].right==r)
  26. {
  27. sum=c[root].val;
  28. return ;
  29. }
  30. int mid=(c[root].left+c[root].right)/2;
  31. if(mid<l)
  32. search_tree(l,r,root*2+1,sum);
  33. else if(mid>=r)
  34. search_tree(l,r,root*2,sum);
  35. else
  36. {
  37. int sum1;
  38. search_tree(l,mid,root*2,sum);
  39. search_tree(mid+1,r,root*2+1,sum1);
  40. sum=sum1+sum;
  41. }
  42. }
  43. void update_tree(int pos,int root,int x)//更新
  44. {
  45. if(c[root].left==c[root].right&&c[root].left==pos)
  46. {
  47. c[root].val+=x;
  48. return ;
  49. }
  50. int mid=(c[root].left+c[root].right)/2;
  51. if(mid<pos)
  52. update_tree(pos,root*2+1,x);
  53. else
  54. update_tree(pos,root*2,x);
  55. c[root].val=c[root*2].val+c[root*2+1].val;
  56. }
  57. int main()
  58. {
  59. int n,t;
  60. scanf("%d",&t);
  61. for(int ncase=1;ncase<=t;ncase++)
  62. {
  63. scanf("%d",&n);
  64. memset(&c,0,sizeof(&c));
  65. build_tree(1,n,1);
  66. getchar();
  67. printf("Case %d:\n",ncase);
  68. while(1)
  69. {
  70. char ch[10];
  71. scanf("%s",ch);
  72. if(ch[0]=='Q')
  73. {
  74. int a,b,sum;
  75. scanf("%d %d",&a,&b);
  76. getchar();
  77. if(a<b)
  78. search_tree(a,b,1,sum);
  79. else
  80. search_tree(b,a,1,sum);
  81. printf("%d\n",sum);
  82. }
  83. else if(ch[0]=='A')
  84. {
  85. int a,b;
  86. scanf("%d %d",&a,&b);
  87. getchar();
  88. update_tree(a,1,b);
  89. }
  90. else if(ch[0]=='S')
  91. {
  92. int a,b;
  93. scanf("%d %d",&a,&b);
  94. getchar();
  95. update_tree(a,1,-b);
  96. }
  97. else
  98. break;
  99. }
  100. }
  101. return 0;
  102. }

hdu1166 敌兵布阵(线段树 求区间和 更新点)的更多相关文章

  1. hdu1166 敌兵布阵 线段树(区间更新)

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

  2. HDU-1166敌兵布阵(线段树)

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

  3. HDU1166 敌兵布阵 线段树详解

    题解: 更新是线段树的单点更新,简单一点. 有50000个阵营,40000查询,用普通数组肯定超时.区间求和和区间查询问题用线段树最好不过了. 先说说什么是线段树. 区间[1,10]用树的方法存起来, ...

  4. 【生活没有希望】hdu1166敌兵布阵 线段树

    线段树水题刷刷,生活没有希望 最近看到代码跟树状数组差不多短的非递归线段树,常数也很小——zkw线段树 于是拿道水题练练手 短到让人身无可恋 ;pos;pos/=) a[pos]+=x;} ,ans= ...

  5. HDU1166 敌兵布阵(线段树)

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

  6. HDU1166 敌兵布阵 —— 线段树单点修改

    题目链接:https://vjudge.net/problem/HDU-1166 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布 ...

  7. HDU1166 敌兵布阵 [线段树模板]

    题意:在序列中修改单点和查询区间和 #include<iostream> #include<cstdio> #include<cstring> #define ls ...

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

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

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

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

随机推荐

  1. 005 Ajax中使用jquery实现三种格式的信息

    1.jquery中的ajax 二:load 2.load方法 3.load测试程序大纲 4.load测试程序 <!DOCTYPE html> <html> <head&g ...

  2. Ionic实战一:Ionic仿照微信项目

    github下载地址:https://github.com/Frogmarch/ionic-wechat 博客学习地址:http://www.cnblogs.com/Frogmarch/ Ionic仿 ...

  3. 部署 LAMP

    部署 LAMP https://help.aliyun.com/document_detail/50774.html?spm=a2c4g.11186623.6.773.Em8xVc 文档提供方:上海驻 ...

  4. OSPF详解

    OSPF 详解 (1) [此博文包含图片] (2013-02-04 18:02:33) 转载 ▼ 标签: 端的 第二 以太 第一个 正在 目录 序言 初学乍练 循序渐进学习OSPF 朱皓 入门之前 了 ...

  5. 用 React 编写移动应用 React Native

    转载:用 React 编写移动应用 React Native ReactNative 可以基于目前大热的开源JavaScript库React.js来开发iOS和Android原生App.而且React ...

  6. Android Actionbar Tab 导航模式

    Android Actionbar Tab 下图中,红色矩形圈起来的就是我们 ActionBar Tab,下面我们将一步一步的实现下图中的效果. 初次尝试 package com.example.it ...

  7. springBoot 自动配置原理

    在之前文章中说过,springBoot会根据jar包去添加许多的自动配置,本文就来说说为什么会自动配置,自动配置的原理时什么? springBoot在运行SpringApplication对象实例化时 ...

  8. [BZOJ2683]简单题/[BZOJ1176][BalkanOI2007]Mokia

    [BZOJ2683]简单题 题目大意: 一个\(n\times n(n\le5\times10^5)\)的矩阵,初始时每个格子里的数全为\(0\).\(m(m\le2\times10^5)\)次操作, ...

  9. 网络抓包及Http Https通信协议分析

    Wireshark基本介绍和学习TCP三次握手 之前写过一篇博客:用 Fiddler 来调试HTTP,HTTPS. 这篇文章介绍另一个好用的抓包工具wireshark, 用来获取网络数据封包,包括ht ...

  10. php的curl也没这么复杂

    许多同学在第一次使用curl的时候感觉一个头两个大(包括我在内),看着这一条条的curl_setopt函数完全摸不着头脑,不过在你花10分钟看了我的介绍后相信你以后也能轻松戏耍php的curl了 首先 ...