【原创】hdu 1166 敌兵布阵(线段树→单点更新,区间查询)
学习线段树的第三天。。。真的是没学点啥好的,又是一道水题,纯模板,我个人觉得我的线段树模板还是不错的(毕竟我第一天相当于啥都没学。。。找了一整天模板,对比了好几个,终于找到了自己喜欢的类型),中文题目嘛,直接上代码
我感觉我的代码有一个特点吧...有点啰嗦,但是每一行的思维和上一行紧密相连,新手看的话不会感到思维的跃迁,比较容易看懂,因为我之前看一些大神的代码,确实看到一半就不知道他下面啥意思了...所以希望我的代码能够造福新手吧=。=
#include<cstdio>
#include<string>
#include<iostream>
#define N 50003
using namespace std;
int num[];
char s[];
struct nod
{
int data,l,r;
}tree[N*];//树型结构的要花费更多的空间,这里要*4 void push_up(int i)//通过i节点的孩子节点更新i节点
{
tree[i].data = tree[i*].data + tree[i*+].data;
} void Build_tree(int i,int l,int r)
{
tree[i].l = l;
tree[i].r = r;
if(l == r){
tree[i].data = num[l];
return ;
}
int mid = (l + r)/;
Build_tree(i*,l,mid);
Build_tree(i*+,mid+,r);
push_up(i);
} void update(int i,int k,int v)
{
if(tree[i].l==k&&tree[i].r==k){//单点更新只要找到特定的k节点就算找到,区间更新要找到一个区间→看我另一篇文章吧
tree[i].data += v;//注意题目意思是增加或减少V个人,所以是+=
return;
}
int mid = (tree[i].l + tree[i].r)/;
if(k <= mid)
update(i*,k,v);
else
update(i*+,k,v);
push_up(i);
} int query(int i,int l,int r)
{
if(l<=tree[i].l&&tree[i].r<=r){
return tree[i].data;
}
int mid = (tree[i].l + tree[i].r)/;
if(r <= mid) //这里看不懂的看我另一篇文章http://www.cnblogs.com/liwenchi/p/5761257.html return query(i*,l,r);
if(l > mid)
return query(i*+,l,r);
return query(i*,l,r)+query(i*+,l,r);
} int main()
{
int noc,ug; //ug这名字随便起的...case数等于ug-noc,noc也是随便起的...number of case
scanf("%d",&noc);
ug = noc;
while(noc--)
{
int n,l,r,i,j;
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&num[i]);
Build_tree(,,n);
printf("Case %d:\n",ug-noc);
while(scanf("%s",s))
{
if(s[] == 'E') break;
if(s[] == 'Q'){
scanf("%d%d",&l,&r);
printf("%d\n",query(,l,r));
}
else if(s[] == 'A'){
scanf("%d%d",&i,&j);
update(,i,j);
}
else{
scanf("%d%d",&i,&j);//减人数的话把j取负再更新就OK了
update(,i,-j);
}
}
}
}
如果有哪里不懂可以看看我其他线段树的文章,都是很基础的!
【原创】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 敌兵布阵 <线段树 单点修改 区间查询>
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- HDU 1166 敌兵布阵 线段树单点更新求和
题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmat ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- HDU 1754 线段树 单点跟新 HDU 1166 敌兵布阵 线段树 区间求和
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu 1166 敌兵布阵 (线段树、单点更新)
敌兵布阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
随机推荐
- MySQL 性能调优之SQL
原文:http://bbs.landingbj.com/t-0-245451-1.html 对于SQL的优化,我们主要提供调整执行计划.优化SQL的方法有:缩短访问的路径.尽早过滤数据.尽可能减少排序 ...
- 如何入门vue之一
入门vue 首先从vue的指令开始学起. vue的指令: v-if 根据是否得到的布尔值进行是否显示. v-show:根据是否得到的布尔值是否显示.不同的地方在于隐藏是style隐藏. v-on 监 ...
- Linux中各个目录作用
对于linux新手来说,最感到迷惑的问题之一就是文件都存在哪里呢?特别是对于那些从windows转过来的新手来说,linux的目录结构看起来有些奇怪哦.比如没有C盘,没有分盘符,一大堆不知道用途的文件 ...
- Linux上的一些基本常用命令
上传下载文件:// 首先安装lrzsz # yum -y install lrzsz // 上传文件,执行命令rz,会跳出文件选择窗口,选择好文件,点击确认即可.# rz // 下载文件,执行命令sz ...
- 保存后自动格式化代码(vscode)
痛点: 写项目的时候, 我们经常会拷贝一些代码, 每当拷贝过来都需要重新调整, 如果可以实现保存自动调整代码, 将会给我们带来很多的便利! 解决: 其实对于vscode来说, 实现这一点很容易. 我们 ...
- 关于 ajax
1.type 提交类型 get /post 2.async 默认true 异步 3.cache 默认 true 读取缓存 false不读取缓存 会在请求后面 添加一个时间戳 https://www. ...
- CentOS7 网络NAT模式
问题:安装完毕ping命令不能用,然后改为桥接模式,ping可以用. 先了解桥接,NAT 的含义. 桥接:在bridged模式下,VMWare虚拟出来的操作系统就像是局域网中的一台独立的主机,它可以访 ...
- Flask从入门到精通
1. flask的下载和安装 在windows下安装flask flask依赖于两个库, 即werkzeug 和jinja2 , werkzeug负责服务器的部署, jinja2负责模板引擎,管理安装 ...
- delphi中 dataset容易出错的地方
最近写delphi项目,用到的数据集中的dataset,一直修改exception啊,写下过程. 在对数据集进行任何操作之前,首先要打开数据集.要打开数据集,可以把Active属性设为True,例如: ...
- Python——数组模块(array)
一.模块说明 array模块是python中实现的一种高效的数组存储类型.它和list相似,但是所有的数组成员必须是同一种类型,在创建数组的时候,就确定了数组的类型. 二.代码