hdu1540-Tunnel Warfare-(线段树+二分)
题意:有n个村庄排成一列,相邻的村庄可以通信,炸毁则不可以通信,进行m个操作。3种操作,1.炸毁某村庄;2.修复上一个被炸毁的村庄;3.查询某个村庄能通信的村庄数(自己算一个)。
解题:求某个点左边扩散和右边扩散的区间和,没被炸毁就算1,炸毁则算0,用二分查找左边界和右边界,假设查询的点为x,则左边界是x-l+1=query(),右边界判断标准是r-x+1=query();两次二分log,查询query也是log,时间复杂度是O(n+m*log*log),限速2000ms,1600+ms,思路简单,勉强能过。
另外还有一个坑:一个村庄可以被多次炸毁,修复只需要一次就够了。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std; int n,m;
int a[];
int sum[*];
stack<int>sta; void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt]=a[l];
return;
}
int mid=(l+r)/;
build(l,mid,rt*);
build(mid+,r,rt*+); sum[rt]=sum[rt*]+sum[rt*+];
} void update(int p,int c,int l,int r,int rt)
{
if(l==r)///到达叶节点,修改后返回
{
sum[rt]=sum[rt]+c;
return ;
}
int mid=(l+r)/;
///根据条件判断往左调用还是往右
if(p<=mid) update(p,c,l, mid, rt*);
else update(p,c,mid+, r, rt*+);
sum[rt] = sum[rt*] + sum[rt*+];
} int query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R)///在区间内,直接返回
return sum[rt]; int m=(l+r)/; ///累计答案
int ans=;
if(L<=m) ans=ans+query(L,R,l,m,rt*);
if(R>m) ans=ans+query(L,R,m+,r,rt*+); return ans;
} int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
while(!sta.empty())
sta.pop();
set<int>se;
for(int i=;i<=n;i++)
a[i]=;
build(,n,);
char c;
while(m--)
{
getchar();
scanf("%c",&c);
int x;
if(c=='D')
{
scanf("%d",&x);
if(a[x]!=)
update(x,-,,n,);
a[x]=;
sta.push(x);
}
else if(c=='R')
{
x=sta.top();
if( a[x]== );
else
{
while( a[x]!= )
{
sta.pop();
x = sta.top();
}
}
sta.pop();
a[x]=;
update(x,,,n,);
}
else
{
int ans=;
scanf("%d",&x); if(a[x]!=)
{
int l=,r=x,res1=-,res2=-;
while(l<=r)///往左找最大连通的村庄数
{
int mid=(l+r)/;
if( query(mid,x,,n,)==x-mid+ )///二分内往左找mid
{
res1=mid;
r=mid-; }
else///二分内往右找
{
l=mid+;
}
}
l=x,r=n;
while(l<=r)
{
int mid=(l+r)/; if( query(x,mid,,n,)==mid-x+ )
{
res2=mid;
l=mid+;
}
else
r=mid-;
}
printf("%d\n",res2-res1+);
}
else
printf("0\n");
}
} } return ;
}
/**
5 12
D 3
D 2
D 1
D 1
D 2
R
R
R
Q 1
Q 2
Q 3
Q 4
*/
hdu1540-Tunnel Warfare-(线段树+二分)的更多相关文章
- hdu1540 Tunnel Warfare 线段树/树状数组
During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...
- HDU1540 Tunnel Warfare —— 线段树 区间合并
题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...
- HDU 1540 Tunnel Warfare (线段树)
Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...
- 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 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...
- Tunnel Warfare 线段树 区间合并|最大最小值
B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...
- HDU 1540 Tunnel Warfare (线段树)
题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...
- 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. ...
随机推荐
- Zookeeper的介绍与基本部署
目录 简介 架构 安装 StandAlone模式 1. 安装 2. 修改配置 3. 启动 4. 验证 5. 基本用法 Distributed模式 1. 配置hosts 2. 配置zoo.cfg 3. ...
- Range Sum Query - Mutable 精简无递归线段树
操作: 单点更新,区间求和 区间求和:如sum [3,10) 需要对19,5,12,26节点求和即可. 观察可知,左端点为右子节点(奇数)时直接相加,右端点为左子节点(偶数)时直接相加,两边向中间移动 ...
- 使用scrapy框架做武林中文网的爬虫
一.安装 首先scrapy的安装之前需要安装这个模块:wheel.lxml.Twisted.pywin32,最后在安装scrapy pip install wheel pip install lxml ...
- Bagging 和RF的区别
跑训练无聊看了看别人的面经,发现自己一时半会答不上来,整理一下. 一.Bagging介绍 先看一个Bagging的一个概念图(图来自https://www.cnblogs.com/nickchen12 ...
- mysql 中的日期格式。date_format( ) 转换格式
date_format( ) 转换格式 : 格式 描述 %a 缩写星期名 %b 缩写月名 %c 月,数值 %D 带有英文前缀的月中的天 %d 月的天,数值(00-31) %e 月的天,数值(0-31) ...
- asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)
这一节主要讲如何测试跨域问题 你可以直接在官网下载示例代码,也可以自己写,我这里直接使用官网样例进行演示 样例代码下载: Cors 一.提供服务方,这里使用的是API 1.创建一个API项目.或者直接 ...
- javaScript 对象的hasOwnProperty方法打印window自定义属性
for (var name in window) { if (window.hasOwnProperty(name)) { window.console.log ( name + " : & ...
- vuejs应用开发前后端分离
我们知道,无论是web应用还是app应用都有一个前后端,前端主要负责界面交互,后端负责数据持久化.在正规公司中一般是由两个团队来分别完成前端和后端的开发,在小公司或者个人开发的项目中,前后端很有可能是 ...
- robotframework-ride1.7.3.1更新安装
在2019年之前,robotframework-ride的版本一直是1.5.2.1,是2016年1月份的版本,里面需要使用 wxPython2.8-win64-unicode-2.8.12.1-py2 ...
- 【MySQL】MySQL高可用架构之MHA
一.关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到master节 ...