【线段树I:母题】hdu 1166 敌兵布阵

题目链接:hdu 1166 敌兵布阵

题目大意

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的责骂的.

笔者生平第一道线段树。线段树是一种高级的二叉搜索树,建树、更新、查询操作复杂度均为O(logN)

说一下思路

  • 线段树的点改动、区间查询
  • segTree[4*_max]四倍数据数组大小

參考代码

/*Author:Hacker_vision*/
#include<bits/stdc++.h>
using namespace std; const int _max = 50000 + 10;
int n,a[_max],x,y;
char s[20];
struct segTree{
int lc,rc;//左孩子、右孩子
int sum;
}segTree[_max*4];//线段树一般为4倍数组元素个数 void build(int root,int L,int R){//建树 O(logN)
segTree[root].lc=L;
segTree[root].rc=R;
if(L==R){
segTree[root].sum=a[L];
return;
}
int mid = (L + R) >> 1;
build(root<<1,L,mid);
build(root<<1|1,mid+1,R);
segTree[root].sum=segTree[root<<1].sum+segTree[root<<1|1].sum;//更新父节点
} void update(int root,int pos,int add){//点改动O(logN)
if(segTree[root].lc==segTree[root].rc){
segTree[root].sum += add;
return ;
}
int mid = (segTree[root].lc + segTree[root].rc) >> 1;
if(pos <= mid) update(root<<1,pos,add);
else update(root<<1|1,pos,add);
//回溯更新父节点
segTree[root].sum=segTree[root<<1].sum+segTree[root<<1|1].sum;
} int query(int root,int L,int R){//区间查询,O(logN)
if(segTree[root].lc==L && segTree[root].rc == R) return segTree[root].sum;
int mid = (segTree[root].lc + segTree[root].rc)>>1;
if(R <= mid) return query(root<<1,L,R);
else if(mid < L) return query(root<<1|1,L,R);
else return query(root<<1,L,mid)+query(root<<1|1,mid+1,R);
} int main(){
//freopen("input.txt","r",stdin);
int T;cin>>T;int cnt=1;
while(T--){
scanf("%d",&n);
for( int i = 1; i <= n; ++ i) scanf("%d",a+i);
build(1,1,n);//建立线段树
printf("Case %d:\n",cnt++);
while(scanf("%s",s)==1&&strcmp(s,"End")){
scanf("%d%d",&x,&y);
if(strcmp(s,"Add")==0) update(1,x,y);//点改动
else if(strcmp(s,"Sub")==0) update(1,x,-y);
else if(strcmp(s,"Query")==0) printf("%d\n",query(1,x,y));//查询区间Ax+……+Ay
}
}
return 0;
}
  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y

【线段树I:母题】hdu 1166 敌兵布阵的更多相关文章

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

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

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

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

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

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

  4. HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和)

    HDOJ(HDU).1166 敌兵布阵 (ST 单点更新 区间求和) 点我挑战题目 题意分析 根据数据范围和询问次数的规模,应该不难看出是个数据结构题目,题目比较裸.题中包括以下命令: 1.Add(i ...

  5. hdu 1166敌兵布阵(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    M ...

  6. HDU 1166 敌兵布阵 (树状数组)

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

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

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

  8. HDU 1166 敌兵布阵(线段树/树状数组模板题)

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

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

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

随机推荐

  1. URI、URL、请求、响应、常见状态代码

    URI:路径(统一资源标识符,包括本地地址和网络地址) URL是URI的一种子路径, URI范围比URL范围广. URL (Uniform Resource Locator,统一全球资源定位符): 通 ...

  2. Linux下查看CPU和内存(很详细)

    在系统维护的过程中,随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 CentOS 中,可以通过 top 命令来查看 CPU 使用状况.运行 top 命令后,CPU 使用状态会 ...

  3. 最新省市区划分码code

    爬取国家统计局省市区code 提供php爬取脚本以及json和sql https://github.com/zzDylan/area-code 觉得好用给个star,3q

  4. Spring Cloud (6) 分布式配置中心-高可用

    高可用 现在已经可以从配置中心读取配置文件了,当微服务很多时都从配置中心读取配置文件,这时可以将配置中心做成一个微服务,将其集群化,从而达到高可用. 改造config-server 加入eureka ...

  5. 笨拙而诡异的 Oracle(之二)

    有一张表,很多数据:   想取某个月的数据.初始的想法很简单,根据日期(RQ)形成条件即可:  符合条件的记录数是 129835,但耗时太长:14.515 秒(RQ字段是做过索引的)!直观的反应是 O ...

  6. 利用php生成验证码

    <?php /** * php生成验证码 * @param $width 画布宽 * @param $height 画布高 * @param $vcodelen 验证码长度 * @param $ ...

  7. SQL基本操作——存储过程

    存储过程类似于C#中的方法. --创建存储过程 create proc usp_TwoNumberAdd @num1 int, @num2 int as begin select @num1+@num ...

  8. 使用TFS創建團隊項目

    使用微軟賬號登錄Team Service,關聯一個TS賬戶,用來存放你所有的項目,可以從瀏覽器中直接訪問,地址類似yourname.visualstudio.com. 詳細鏈接 在TS賬戶主面板中,可 ...

  9. 在Windows下安装Elasticsearch5.0

    1.准备工作 安装和配置Java环境 2.下载 地址:https://www.elastic.co/downloads/elasticsearch 老版本:https://www.elastic.co ...

  10. 基于zk“临时顺序节点“的分布式锁

    import org.apache.zookeeper.*; import org.apache.zookeeper.data.Stat; import java.io.IOException; im ...