hdu 1166 敌兵布阵(线段树详解)
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std; struct node //用结构体来构建一个线段树
{
int l;//左区间值,此题代表营号
int r;//右区间值,同上
int n;//值,此题代表第l个到第r个营地的总人数
} t[];//线段树的下标 void build(int l,int r,int k)//构建线段树,应用递归思想~
{
if(r==l)//左右区间值相等,此题代表单个营号
{
t[k].l=l;
t[k].r=r;
t[k].n=;//初始化,因为还没有输入营地人数
return ;//递归出口
}
t[k].l=l; // 写入第k个结点中的 左区间
t[k].r=r; // 写入第k个结点中的 右区间
t[k].n=; //初始化
int mid=(r+l)/;//将区间一分为二,这里是二分思想
build(l,mid,*k);//该结点往 左孩子的方向 继续建立线段树
build(mid+,r,*k+);// 该结点往 右孩子的方向 继续建立线段树
} void insert(int n,int d,int k)//单点更新线段树,此题的意思是改变营地人数
{
//n是变化的人数,d是营号,k=1,记住是从根本开始(递归
if(t[k].l==t[k].r&&t[k].l==d)//找到该营地
{
t[k].n+=n;//更新单点,即变化人数
return ;
}
int mid=(t[k].l+t[k].r)/;//一分为二
if(d<=mid) insert(n,d,*k);//如果营号是在左区间里,向左侧递归变化
else insert(n,d,*k+);//如果营号是在右区间里,向右侧递归变化
t[k].n=t[*k].n+t[*k+].n;//更新所有区间里值,即从下往上改变人数
} int ans; void search(int a,int b,int k)//区间查找
{
if(t[k].l==a&&t[k].r==b)//找到区间
{
ans+=t[k].n;//由于会出现区间在树中不连续,即区间被mid截断
return ;
}
int mid=(t[k].l+t[k].r)/;
if(b<=mid) search(a,b,*k);//查询区间被[L,Mid]包含,此时直接在左边查找[a,b]
else if(a>mid) search(a,b,*k+);//查询区间被[mid,r]包含,此时直接在右查找[a,b]
else//区间被mid截断
{
search(a,mid,*k);//分开查找!
search(mid+,b,*k+);
}
} int main()
{
int c,n,a,b;
char ch[];
scanf("%d",&c);
for(int m=;m<=c;m++)
{
scanf("%d",&n);
build(,n,);
int num;
for(int i=;i<=n;i++)
{
scanf("%d",&num);
insert(num,i,);
}
printf("Case %d:\n",m);
while(scanf("%s",ch),strcmp(ch,"End"))
{
scanf("%d%d",&a,&b);
if(strcmp(ch,"Add")==) insert(b,a,);
else if(strcmp(ch,"Sub")==) insert(-b,a,);
else
{
ans=;
search(a,b,);
printf("%d\n",ans);
}
}
}
return ;
}
hdu 1166 敌兵布阵(线段树详解)的更多相关文章
- 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的任务就是要监视 ...
- HDU 1166 敌兵布阵 线段树
敌兵布阵 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
随机推荐
- Selenium 中文API
Selenium 中文API 转自:http://blog.csdn.net/lh9529/article/details/3946567 概念 Selenium 通过命令进行驱动.Seleniu ...
- express学习点滴- session()和cookieSession()的区别
express 里提供了两种有关session的中间件 * session() 提供了内存和数据库两种方式保存session.具体两种session原理请自行学习,不进行展开了.自己也是一知半解... ...
- 【Shell】Linux中分区脚本
后天要中期答辩了,今天只刷了一个题,还没写出来,但是想更新博客,所以只有把之前写的东西贴出来了. 一个用于分区的shell脚本 1 #!/bin/bash #指定脚本解释器路径 2 echo &quo ...
- php基础(五)日期
PHP Date() 函数 date(format,timestamp) 参数 描述 format 必需.规定时间戳的格式. timestamp 可选.规定时间戳.默认是当前时间和日期. 注释:时间戳 ...
- ggplot2 geom相关设置——添加线条
在作图过程中,有时我们可能需要通过添加一些线条,使得图形的可视化变得更好,比如一些趋势线等等. 下面我们来看下,一些线条的添加方式. geom_abline(mapping = NULL, data ...
- Java 序列化 对象序列化和反序列化
Java 序列化 对象序列化和反序列化 @author ixenos 对象序列化是什么 1.对象序列化就是把一个对象的状态转化成一个字节流. 我们可以把这样的字节流存储为一个文件,作为对这个对象的复制 ...
- Debian上安装java
Debian 8 Jessie上安装命令: echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main&qu ...
- pthread_create线程创建的过程剖析(转)
概述 在Linux环境下,pthread库提供的pthread_create()API函数,用于创建一个线程.线程创建失败时,它可能会返回ENOMEM或EAGAIN.这篇文章主要讨论线程创建过程中碰到 ...
- Delphi中,FALSE 和 nil ,true 和 nil,0的区别
True和False是布尔型(Boolean)的值,就是"是"或"否"的意思.nil就是空,一般用于指针或对象变量,指对针或对象对象一般初始化为nil或者释放后 ...
- FZU 1896 神奇的魔法数 dp
网上都说是数位dp 但是虽然在队伍里负责动态规划 但是数位dp还不会…… 百度了一下 发现和最大子序列思路差不多…… 最大子序列的dp[i][j]是表示两个序列前i项和前j项的最大子序列…… dp[i ...