HDU 1166 敌兵布阵 (线段树 单点更新)
线段树掌握的很差,打算从头从最简单的开始刷一波, 嗯。。就从这个题开始吧!
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
const int maxn = +;
using namespace std;
int a[maxn], n;
struct line
{
int l, r, val;
}tr[maxn<<]; void build(int o, int l, int r)
{
tr[o].l = l; tr[o].r = r;
if(l == r)
{
tr[o].val = a[l];
return;
}
int mid = (l+r)>>;
build(*o, l, mid);
build(*o+, mid+, r);
tr[o].val = tr[*o].val+tr[*o+].val;
}
int query(int o, int l, int r)
{
if(tr[o].l==l && tr[o].r==r)
return tr[o].val;
int mid = (tr[o].l+tr[o].r)>>;
if(r <= mid) query(*o, l, r);
else if(l > mid) query(*o+, l, r);
else
return (query(*o, l, mid)+query(*o+, mid+, r));
}
void update(int o, int p, int add)
{
if(tr[o].l==tr[o].r&&tr[o].l==p)
{
tr[o].val += add;
return;
}
int mid = (tr[o].l+tr[o].r)>>;
if(p<=mid) update(*o, p, add);
else update(*o+, p, add);
tr[o].val = tr[*o].val+tr[*o+].val;
}
int main()
{
int t, i, ca = ;
int p, add, l, r;
char s[];
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = ; i <= n; i++)
scanf("%d", &a[i]);
printf("Case %d:\n", ca++); build(, , n);
while(~scanf("%s", s))
{
if(strcmp(s, "End")==) break;
if(s[]=='Q')
{
scanf("%d%d", &l, &r);
printf("%d\n", query(, l, r));
}
if(s[]=='A')
{
scanf("%d%d", &p, &add);
update(, p, add);
}
if(s[]=='S')
{
scanf("%d%d", &p, &add);
update(, p, -add);
}
}
}
return ;
}
注释的代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cstdlib>
#include <algorithm>
const int maxn = +;
using namespace std;
int a[maxn], n;
struct line
{
int l, r, val; //val表示该区间的和
}tr[maxn<<]; void build(int o, int l, int r) //o代表当前节点编号
{
tr[o].l = l; tr[o].r = r;
if(l == r)
{
tr[o].val = a[l];
return;
}
int mid = (l+r)>>;
build(*o, l, mid);
build(*o+, mid+, r);
tr[o].val = tr[*o].val+tr[*o+].val; //建树把值从下往上加起来
}
int query(int o, int l, int r) //求l到r的和
{
if(tr[o].l==l && tr[o].r==r) //节点的区间吻合返回
return tr[o].val;
int mid = (tr[o].l+tr[o].r)>>;
if(r <= mid) query(*o, l, r);
else if(l > mid) query(*o+, l, r);
else
return (query(*o, l, mid)+query(*o+, mid+, r)); //横跨了区间
}
void update(int o, int p, int add) //对p节点增加add
{
if(tr[o].l==tr[o].r&&tr[o].l==p)
{
tr[o].val += add;
return;
}
int mid = (tr[o].l+tr[o].r)>>;
if(p<=mid) update(*o, p, add);
else update(*o+, p, add);
tr[o].val = tr[*o].val+tr[*o+].val; //找到值以后的更新
}
int main()
{
int t, i, ca = ;
int p, add, l, r;
char s[];
scanf("%d", &t);
while(t--)
{
scanf("%d", &n);
for(i = ; i <= n; i++)
scanf("%d", &a[i]);
printf("Case %d:\n", ca++); build(, , n);
while(~scanf("%s", s))
{
if(strcmp(s, "End")==) break;
if(s[]=='Q')
{
scanf("%d%d", &l, &r);
printf("%d\n", query(, l, r));
}
if(s[]=='A')
{
scanf("%d%d", &p, &add);
update(, p, add);
}
if(s[]=='S')
{
scanf("%d%d", &p, &add);
update(, p, -add);
}
}
}
return ;
}
HDU 1166 敌兵布阵 (线段树 单点更新)的更多相关文章
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- HDU 1166 敌兵布阵(线段树单点更新,板子题)
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submi ...
- HDU 1166 敌兵布阵(线段树单点更新)
敌兵布阵 单点更新和区间更新还是有一些区别的,应该注意! [题目链接]敌兵布阵 [题目类型]线段树单点更新 &题意: 第一行一个整数T,表示有T组数据. 每组数据第一行一个正整数N(N< ...
- HDU 1166 敌兵布阵(线段树单点更新,区间查询)
描述 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况 ...
- HDU 1166 敌兵布阵 线段树单点更新求和
题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...
- 【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)
学习线段树的第三天...真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学...找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1166 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题
题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...
随机推荐
- asp.net 中给gridview添加自动序号
第一种方式,直接在Aspx页面GridView模板列中.这种的缺点是到第二页分页时又重新开始了. 代码如下: <asp:TemplateField HeaderText="序号&quo ...
- 在ubuntu16.04 下安装haproxy 1.5.11 做tcp负载均衡
由于haproxy需要FQ下载,所以从csdn下载了较为新版的haproxy1.5.11,安装过程如下: 1. 解压haproxy-1.5.11.tar.gz : tar xzvf haproxy-1 ...
- 【转】使用JIRA搭建企业问题跟踪系统【个人推荐】
免责声明: 本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除. 原文作者:Judy Shen的专栏 原文地址:使用JIRA搭建企业问题跟踪系统 ...
- Struct2 自定义拦截器
1 因为struct2 如文件上传,数据验证等功能都是由系统默认的 defalutStack中的拦截器实现的,所以我们定义拦截器需要引用系统默认的defalutStack 这样才不会影响struct2 ...
- android 解析XML方式(二)
上一节中,我们使用DOM方式解析xml文档,该方式比较符合我们日常思维方式,容易上手,但是它直接把文档调入内存中,比较耗内存.在这里我们可以用另外一种方式解析xml,这个就是SAX方式. SAX即是: ...
- java 页面换行处理
在taxtarea中输入的文本.如果含有回车或空格.在界面上显示的时候则不哪么正常.回车消失了,空格变短了. 如何解决这个问题呢.有2种方法. 1.使用<pre>标签 w3c对pre元素是 ...
- Curl的毫秒超时的一个”Bug”
Curl的毫秒超时的一个”Bug” -- PHP老杨 最近我们的服务在升级php使用的libcurl, 期望新版本的libcurl支持毫秒级的超时, 从而可以更加精细的控制后端的接口超时, 从而提高整 ...
- HDU1251 统计难题 Trie树
题目很水,但毕竟是自己第一道的Trie,所以还是发一下吧.Trie的更多的应用慢慢学,AC自动机什么的也慢慢学.... #include<iostream> #include<cst ...
- C# DataTable转换成DataRow
linq中的cast<T>()及OfType<T>() DataTable dt=...........//获取从数据库中取出的数据(假设只有一条记录) //Cast<T ...
- 使用Flexible实现手淘H5页面的终端适配【转】
曾几何时为了兼容IE低版本浏览器而头痛,以为到Mobile时代可以跟这些麻烦说拜拜.可没想到到了移动时代,为了处理各终端的适配而乱了手脚.对于混迹各社区的偶,时常发现大家拿手机淘宝的H5页面做讨论—— ...