HDU 1166 敌兵布阵 线段树的基本应用——动态区间和问题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=1166
简单题,1A了,这个好像就是传说中的“点树”。
设当前结点表示线段[left, right],编号为i,则结点的左孩子表示线段[left, mid], 编号为2*i,右孩子表示线段[mid+1, right], 编号为2*i+1。
#include <stdio.h>
#include <string.h> const int MAXN = ; //线段树的结点,分别表示一条线段的左端点、右端点、增加的人数
struct Tree_Node
{
int left;
int right;
int num;
}tree[*MAXN]; //建立线段树,left和right对应线段树结点中的left和right,i表示当前结点的线段树编号
void build(int left, int right, int i)
{
tree[i].left = left;
tree[i].right = right;
tree[i].num = ;
if(left == right)
{
return;
}
int mid = (left + right) / ;
build(left, mid, *i);
build(mid+, right, *i+);
} //插入到线段树,tar表示增加人数的那个点在数轴上的编号(不是在线段树上的编号)
//num表示增加的人数,step表示当前结点的线段树编号
void insert(int tar, int num, int step)
{
if(tree[step].left <= tar && tree[step].right >= tar)
{
tree[step].num += num;
}
if(tree[step].left == tree[step].right)
{
return;
}
int mid = (tree[step].left + tree[step].right) / ;
if(tar <= mid)
{
insert(tar, num, step*);
}
else
{
insert(tar, num, step*+);
}
} //left和right表示查询的区间,step表示当前结点的线段树编号
int query(int left, int right, int step)
{
if(tree[step].left == left && tree[step].right == right)
{
return tree[step].num;
}
int mid = (tree[step].left + tree[step].right) / ;
if(right <= mid)
{
return query(left, right, step*);
}
else if(left > mid)
{
return query(left, right, step*+);
}
else
{
return query(left, mid, step*) + query(mid+, right, step*+);
}
} int main()
{
int t, n, x;
scanf("%d", &t);
for(int item = ; item <= t; item++)
{
scanf("%d", &n);
build(, n, );
for(int i = ; i <= n; i++)
{
scanf("%d", &x);
insert(i, x, );
}
char cmd[];
int a, b;
printf("Case %d:\n", item);
while(scanf("%s", cmd) != EOF && cmd[] != 'E')
{
scanf("%d %d", &a, &b);
if(cmd[] == 'Q')
{
printf("%d\n", query(a, b, ));
}
else if(cmd[] == 'A')
{
insert(a, b, );
}
else if(cmd[] == 'S')
{
insert(a, -b, );
}
}
}
return ;
}
HDU 1166 敌兵布阵 线段树的基本应用——动态区间和问题的更多相关文章
- HDU - 1166 - 敌兵布阵 线段树的单点修改,区间求和
#include<iostream> #include<stdio.h> #include<string.h> #include<algorithm> ...
- HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)
HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...
- hdu 1166 敌兵布阵 线段树 点更新
// hdu 1166 敌兵布阵 线段树 点更新 // // 这道题裸的线段树的点更新,直接写就能够了 // // 一直以来想要进线段树的坑,结果一直没有跳进去,今天算是跳进去吧, // 尽管十分简单 ...
- 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 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 Submis ...
- hdu 1166 敌兵布阵 (线段树、单点更新)
敌兵布阵Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hdu 1166 敌兵布阵 线段树区间修改、查询、单点修改 板子题
题目链接:敌兵布阵 题目: C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视 ...
随机推荐
- Unix/Linux环境C编程新手教程(12) openSUSECCPP以及Linux内核驱动开发环境搭建
1. openSUSE是一款优秀的linux. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRjYXN0Y3Bw/font/5a6L5L2T/font ...
- Add an IPv6 route through an interface
Not often needed, sometimes in cases of dedicated point-to-point links. 7.4.1. Using "ip" ...
- TCP/IP协议原理与应用笔记14:电路交换 和 分组交换
1. 电路交换: (1)建立连接 (2)数据传输 (3)拆除连接 2. 分组交换 (1)数据报: 根据网络的特性,将数据报分成不同大小的部分,经过不同网路传递到相同的目的地.如下: 这里A--X 和 ...
- fuck'em
不要说GUNGHO的游戏,连逆转三国这种都没玩过,还是做手游的,表现的那么冠冕堂皇,还不只是个常规的做软件的而已.只是以做软件的程度来做游戏,能做出的是个JB.
- iOS之CAKeyframeAnimation关键帧动画详解
CABasicAnimation算是CAKeyFrameAnimation的 特殊情况,即不考虑中间变换过程,只考虑起始点与目标点就可以了.而CAKeyFrameAnimation则更复杂一些,允许我 ...
- maven项目转换成dynamic项目
由于maven项目不能直接运行调试需要转换成danamic web后,才能方便进行调试测试.以下是maven项目进行转换的过程 第一步,选择project faces,设置dynamic web版本. ...
- spring mvc 3.1的自动注入参数遇到的问题
在网上下载了xheditor作为页面的编辑器,编辑内容后post到后台保存,后台方法用spring mvc的自动注入的方式接收参数. 这种方式在各个浏览器下运行良好,但是在ie11下发现,从word. ...
- 学点css基础
中午时间学点css,附带http://www.w3cschool.cc/css/css-tutorial.html这个链接! 中午的时间学了这些东西!如下图: 附带代码: <!DOCTYPE h ...
- SQL Server内连接、外连接、交叉连接
前言 在数据库查询中,我们常常会用到的表连接查询,而我自己在工作中也是时常用这些表连接查询.而就在刚刚我却还没有搞清楚数据库表连接到底有哪几种, 这几种表连接查询方式又有什么区别,实属惭愧!借以此文以 ...
- 20160420javaweb之文件上传和下载
一.文件上传 1.提供表单允许用户通过表单选择文件进行上传 表单必须是POST提交 文件输入框必须有name属性,只有有name属性的输入项浏览器才会进行提交 需要设置enctype属性值为multi ...