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) ...
随机推荐
- 介绍几个移动web app开发框架
jQuery Mobile jQuery Mobile框架能够帮助你快速开发出支持多种移动设备的Mobile应用用户界面.jQuery Mobile最新版本是1.4.0,默认主题采用扁平化设计风格.j ...
- Ubuntu mysql安装,还有可视化界面
安装mysql sudo apt-get install mysql-server sudo apt-get install mysql-client sudo apt-get install lib ...
- hdu 4790 Just Random (思路+分类计算+数学)
Problem Description Coach Pang and Uncle Yang both love numbers. Every morning they play a game with ...
- [Javascript] The JSON.stringify API
JSON (JavaScript Object Notation) is a standard method to serialize JavaScript objects and is common ...
- Codeforces Round #311 (Div. 2) E - Ann and Half-Palindrome(字典树+dp)
E. Ann and Half-Palindrome time limit per test 1.5 seconds memory limit per test 512 megabytes input ...
- C++11下的线程池以及灵活的functional + bind + lamda
利用boost的thread实现一个线程类,维护一个任务队列,以便可以承载非常灵活的调用.这个线程类可以方便的为后面的线程池打好基础.线程池还是动态均衡,没有什么别的.由于minGW 4.7 对 C+ ...
- 一张图看懂dex
最近在看dex文件格式,看的是飞虫大大的android软件安全与逆向分析一书,写的条理很清晰.相对于elf文件来说,dex文件格式简单了很多,但是提到某个字段,仍然难以想象其所处位置.所以一直想用思维 ...
- 监控工具nagios
Nagios 简介是一个开源软件,可以监控网络设备网络流量.Linux/windows主机状态,甚至可以监控打印机它可以运行在Linux上或windows上基于浏览器的web界面方便运维人员查看监控项 ...
- 使用堆栈结构进行字符串表达式("7*2-5*3-3+6/3")的计算
问题: 给定字符串String str = "7*2-5*3-3+6/3", 求出字符串里面表达式的结果? 像javascript有自带的eval()方法,可以直接计算.但java ...
- 可用与禁用 E:enabled { sRules }
<!DOCTYPE html><html lang="zh-cmn-Hans"><head><meta charset="utf ...