题意:有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-(线段树+二分)的更多相关文章

  1. hdu1540 Tunnel Warfare 线段树/树状数组

    During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast a ...

  2. HDU1540 Tunnel Warfare —— 线段树 区间合并

    题目链接:https://vjudge.net/problem/HDU-1540 uring the War of Resistance Against Japan, tunnel warfare w ...

  3. HDU 1540 Tunnel Warfare (线段树)

    Tunnel Warfare Problem Description During the War of Resistance Against Japan, tunnel warfare was ca ...

  4. HDU 1540 Tunnel Warfare 线段树区间合并

    Tunnel Warfare 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少 思路:一个节点的最大连续区间由(左儿子的最大的连续区间,右儿子的最大连续区 ...

  5. hdu 1540 Tunnel Warfare(线段树区间统计)

    Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  6. hdu 1540 Tunnel Warfare 线段树 单点更新,查询区间长度,区间合并

    Tunnel Warfare Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pi ...

  7. Tunnel Warfare 线段树 区间合并|最大最小值

    B - Tunnel WarfareHDU - 1540 这个有两种方法,一个是区间和并,这个我个人感觉异常恶心 第二种方法就是找最大最小值 kuangbin——线段树专题 H - Tunnel Wa ...

  8. HDU 1540 Tunnel Warfare (线段树)

    题目大意: n 个村庄排列在一条直线上,相邻的村庄有地道连接,除首尾两个村庄外,其余村庄都有两个相邻的村庄.其中有 3 中操作 D x :表示摧毁编号为 x 的村庄,Q x:表示求出包含村庄 x 的最 ...

  9. HDU 1540 Tunnel Warfare (线段树或set水过)

    题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 析:首先可以用set水过,set用来记录每个被破坏的村庄,然后查找时,只要查找左右两个端点好. 用线段 ...

  10. hdu 1540 Tunnel Warfare 线段树 区间合并

    题意: 三个操作符 D x:摧毁第x个隧道 R x:修复上一个被摧毁的隧道,将摧毁的隧道入栈,修复就出栈 Q x:查询x所在的最长未摧毁隧道的区间长度. 1.如果当前区间全是未摧毁隧道,返回长度 2. ...

随机推荐

  1. Zookeeper的介绍与基本部署

    目录 简介 架构 安装 StandAlone模式 1. 安装 2. 修改配置 3. 启动 4. 验证 5. 基本用法 Distributed模式 1. 配置hosts 2. 配置zoo.cfg 3. ...

  2. Range Sum Query - Mutable 精简无递归线段树

    操作: 单点更新,区间求和 区间求和:如sum [3,10) 需要对19,5,12,26节点求和即可. 观察可知,左端点为右子节点(奇数)时直接相加,右端点为左子节点(偶数)时直接相加,两边向中间移动 ...

  3. 使用scrapy框架做武林中文网的爬虫

    一.安装 首先scrapy的安装之前需要安装这个模块:wheel.lxml.Twisted.pywin32,最后在安装scrapy pip install wheel pip install lxml ...

  4. Bagging 和RF的区别

    跑训练无聊看了看别人的面经,发现自己一时半会答不上来,整理一下. 一.Bagging介绍 先看一个Bagging的一个概念图(图来自https://www.cnblogs.com/nickchen12 ...

  5. mysql 中的日期格式。date_format( ) 转换格式

    date_format( ) 转换格式 : 格式 描述 %a 缩写星期名 %b 缩写月名 %c 月,数值 %D 带有英文前缀的月中的天 %d 月的天,数值(00-31) %e 月的天,数值(0-31) ...

  6. asp.net core 系列之允许跨域访问2之测试跨域(Enable Cross-Origin Requests:CORS)

    这一节主要讲如何测试跨域问题 你可以直接在官网下载示例代码,也可以自己写,我这里直接使用官网样例进行演示 样例代码下载: Cors 一.提供服务方,这里使用的是API 1.创建一个API项目.或者直接 ...

  7. javaScript 对象的hasOwnProperty方法打印window自定义属性

    for (var name in window) { if (window.hasOwnProperty(name)) { window.console.log ( name + " : & ...

  8. vuejs应用开发前后端分离

    我们知道,无论是web应用还是app应用都有一个前后端,前端主要负责界面交互,后端负责数据持久化.在正规公司中一般是由两个团队来分别完成前端和后端的开发,在小公司或者个人开发的项目中,前后端很有可能是 ...

  9. robotframework-ride1.7.3.1更新安装

    在2019年之前,robotframework-ride的版本一直是1.5.2.1,是2016年1月份的版本,里面需要使用 wxPython2.8-win64-unicode-2.8.12.1-py2 ...

  10. 【MySQL】MySQL高可用架构之MHA

    一.关于MHA MHA(Master HA)是一款开源的MySQL的高可用程序,它为MySQL主从复制架构提供了automating master failover 功能.MHA在监控到master节 ...