HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄。其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最长区间中村庄的数目,R 表示修复最后摧毁的村庄。输入 n,m 分别表示村庄的树木,和操作的次数。
思路 : 当查询包含 村庄 x 的最长区间的村庄数时,可以求出位于 区间 [1,x-1] 中被摧毁的最大村庄编号,求出[x+1,n] 中被摧毁的最小村庄的编号。由此便可求出结果。
可利用线段树存储区间内的被摧毁的村庄的最大和最小编号。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
#define INF 100000000
int n,m;
struct node{
int l;
int r;
int MAX;
int MIN;
}a[201000];
void buildtree(int i,int l,int r){
a[i].l = l ;
a[i].r = r ;
a[i].MAX = -INF ;
a[i].MIN = INF ;
if(l == r)
return ;
int mid = (l+r)/2;
buildtree(i*2,l,mid);
buildtree(i*2+1,mid+1,r);
}
void Destory(int i,int x){
a[i].MAX = max(a[i].MAX,x);
a[i].MIN = min(a[i].MIN,x);
if(a[i].l == a[i].r)
return ;
int mid = (a[i].l + a[i].r) / 2;
if(x <= mid)
Destory(i*2,x);
else
Destory(i*2+1,x);
}
int Querymax(int i,int l,int r){
if(a[i].l == l && a[i].r == r){
return a[i].MAX ;
}
if(a[i].l == a[i].r)
return a[i].MAX;
int ans = -INF;
int mid = (a[i].l + a[i].r) / 2 ;
if(r <= mid)
ans = Querymax(i*2,l,r);
else if(l > mid)
ans = Querymax(i*2+1,l,r);
else{
ans = max(ans,Querymax(i*2,l,mid));
ans = max(ans,Querymax(i*2+1,mid+1,r));
}
return ans ;
}
int Querymin(int i,int l,int r){
if(a[i].l == l && a[i].r == r)
return a[i].MIN ;
if(a[i].l == a[i].r)
return a[i].MIN;
int ans = INF ;
int mid = (a[i].l + a[i].r) / 2 ;
if(r <= mid)
ans = Querymin(i*2,l,r) ;
else if(l > mid)
ans = Querymin(i*2+1,l,r) ;
else{
ans = min(ans,Querymin(i*2,l,mid));
ans = min(ans,Querymin(i*2+1,mid+1,r));
}
return ans ;
}
void rebuild(int i,int x){
if(a[i].l == a[i].r){
a[i].MAX = -INF ;
a[i].MIN = INF ;
return ;
}
int mid = (a[i].l + a[i].r) / 2 ;
if(x <= mid)
rebuild(i*2,x);
else
rebuild(i*2+1,x);
a[i].MAX = max(a[i*2].MAX,a[i*2+1].MAX);
a[i].MIN = min(a[i*2].MIN,a[i*2+1].MIN);
}
int main(){
char op;
int x,sum,top,stack[50000];
while(~scanf("%d%d",&n,&m)){
buildtree(1,1,n);
top = 0;
for(int k=1;k<=m;k++){
getchar();
scanf("%c",&op) ;
if(op == 'D'){
scanf("%d",&x);
stack[top++] = x ;
Destory(1,x);
}
else if(op == 'Q'){
scanf("%d",&x);
int ans1 = Querymax(1,1,x);
int ans2 = Querymin(1,x,n);
if(ans1==x || ans2==x)
printf("0\n");
else {
if(ans1 == -INF)
sum = x - 1 ;
else
sum = x - ans1 - 1 ;
if(ans2 == INF)
sum += n - x ;
else
sum += ans2 - 1 - x;
sum ++ ;
printf("%d\n",sum);
}
}
else if(op == 'R'){
if(top > 0)
rebuild(1,stack[--top]);
}
}
}
return 0;
}
HDU 1540 Tunnel Warfare (线段树)的更多相关文章
- hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并
Tunnel Warfare Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- HDU 1540 Tunnel Warfare 线段树区间合并
Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...
- hdu 1540 Tunnel Warfare(线段树区间统计)
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU 1540 Tunnel Warfare (线段树)
Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...
- HDU 1540 Tunnel Warfare (线段树或set水过)
题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...
- hdu 1540 Tunnel Warfare 线段树 区间合并
题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...
- hdu 1540 Tunnel Warfare 线段数区间合并
Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) P ...
- HDU 1540 Tunnel Warfare(最长连续区间 基础)
校赛,还有什么途径可以申请加入ACM校队? Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1540 Tunnel Warfare (区间线段树(模板))
http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...
随机推荐
- cf443A Anton and Letters
A. Anton and Letters time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- hdu2082:简单母函数
题目大意: a,b,c,d...z这些字母的价值是1,2,3......26 给定 这26个字母分别的数量,求总价值不超过50的单词的数量 分析: 标准做法是构造母函数 把某个单词看作是,关于x的多项 ...
- IEEE论文格式要求
0.特别提示:本次会议要求各位作者根据审稿意见进行认真修改,然后经过大会主席的检查合格才允许上传IEEE eXpress,主要的目的是为了保证论文集的质量,不让论文格式出现五花八门的情况,确保会议后被 ...
- NetAnalyzer笔记 之 八 NetAnalyzer2016使用方法(2)
[创建时间:2016-05-06 22:07:00] NetAnalyzer下载地址 在写本篇的时候,NetAnalyzer 3.1版本已经发布,所以本篇就以最新版本的为例继续使用,并且顺带说明一下, ...
- android分享到新浪微博,认证+发送微博,
分享到新浪微博,折腾了大半个月,现在终于弄出来了,心里的那个爽呀,太痛快了,哈哈!! 废话少说,首先是认证, 1.进入新浪微博提供的开放平台http://open.weibo.com/ 注册新浪账号. ...
- BoneCP学习笔记
什么是BoneCP BoneCP 是一个快速.免费而且开源的java数据库连接池(JDBC Pool)管理工具库.如果你曾经使用过C3P0或者DBCP,那你肯定知道上面这句话的意思:如果你没用过这些, ...
- CocoaPods的一些理解
在这片博客中,我将分享我从cocopods中学到的东西. 如果你使用Cocoapods,你的.gitignore文件中会有什么. 这个问题在debate on SO中被提及,但是我建议只追踪Podfi ...
- JS基础函数
函数是由事件驱动的或者当它被调用时执行的可重复使用的代码块 <script> function demo(){ var a = 10; var b = 25; var sum = a + ...
- 基于'sessionStorage'与'userData'的类session存储
Storage.js: 注意:此版本实现的存储在符合Web存储标准(ie8及ie8以上的版本与其他主流浏览器)的情况下与session的周期一致,但在页面不关闭的情况下没有过期时间,ie7及以下版本则 ...
- utf-8的mysql表笔记
链接数据库指定编码集jdbc:mysql://192.168.2.33:3306/mybase?useUnicode=true&characterEncoding=UTF-8 mysql默认链 ...