题干:

During the War of Resistance Against Japan, tunnel warfare was carried out extensively in the vast areas of north China Plain. Generally speaking, villages connected by tunnels lay in a line. Except the two at the ends, every village was directly connected with two neighboring ones.

Frequently the invaders launched attack on some of the villages and destroyed the parts of tunnels in them. The Eighth Route Army commanders requested the latest connection state of the tunnels and villages. If some villages are severely isolated, restoration of connection must be done immediately!

Input

The first line of the input contains two positive integers n and m (n, m ≤ 50,000) indicating the number of villages and events. Each of the next m lines describes an event.

There are three different events described in different format shown below:

D x: The x-th village was destroyed.

Q x: The Army commands requested the number of villages that x-th village was directly or indirectly connected with including itself.

R: The village destroyed last was rebuilt.

Output

Output the answer to each of the Army commanders’ request in order on a separate line.

Sample Input

7 9
D 3
D 6
D 5
Q 4
Q 5
R
Q 4
R
Q 4

Sample Output

1
0
2
4

题目大意:

D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少

解题报告:

区间合并  + 单点更新 + 区间查询(最长覆盖区间查询)。用栈来记录 修复 的顺序。

AC代码:

#include<bits/stdc++.h>using namespace std;
const int MAX = 50000 + 5;
struct TREE {int l,r;int left,right,all;int laz;
} tree[4*MAX];
stack<int > sk;void modify(int cur,int val) {tree[cur].left = tree[cur].right = tree[cur].all = val;
}
//void pushup(int cur) {
//  if(tree[cur*2].left == tree[cur*2].r - tree[cur*2].l + 1) tree[cur].left = tree[cur*2].left + tree[cur*2+1].left;
//  else tree[cur].left = tree[cur*2].left;
//  if(tree[cur*2+1].right == tree[cur*2+1].r - tree[cur*2+1].l + 1) tree[cur].right = tree[cur*2+1].right + tree[cur*2].right;
//  tree[cur].all = max( tree[cur*2].right + tree[cur*2+1].left, max( tree[cur*2].all,tree[cur*2+1].all ) );
//}
void pushup(int cur) {tree[cur].left = tree[cur*2].left;if(tree[cur].left/*也可以写tree[cur*2].left*/== tree[cur*2].r - tree[cur*2].l + 1) tree[cur].left +=tree[cur*2+1].left; //这里是cur*2+1!!不是cur*2 tree[cur].right = tree[cur*2+1].right;if(tree[cur].right == tree[cur*2+1].r - tree[cur*2+1].l + 1) tree[cur].right += tree[cur*2].right;tree[cur].all = max(tree[cur*2].right + tree[cur*2+1].left,max(tree[cur*2].all,tree[cur*2+1].all));//这里必须用tree[cur*2].all,tree[cur*2+1].all),不能用left和right! }
void build(int l,int r ,int cur) {tree[cur].l = l;tree[cur].r = r;tree[cur].laz = -1;if(l == r) {tree[cur].all = tree[cur].left = tree[cur].right = 1;return ;}int m = (l+r)/2;build(l,m,cur*2);build(m+1,r,cur*2+1);pushup(cur);
}
void update1(int tar,int val, int l,int r,int cur) {if(l == r) {modify(cur,val);tree[cur].laz = val;return ;}int m = (l+r)/2;if(tar <=m) update1(tar,val,l,m,cur*2);else update1(tar,val,m+1,r,cur*2+1);pushup(cur);
}
int query(int tar,int l,int r,int cur) {if(l == r ) return tree[cur].left;//是all和是
//      if(l == r || tree[cur].all == 0 || tree[cur].all == tree[cur].r-tree[cur].l + 1) return tree[cur].all;
//  pushdown(tree[cur].l,tree[cur].r,cur);int res = 0,tmp1 = 0,tmp2 = 0,tmp3 = 0;int m = (l+r)/2;
//  if(tar <= m) res += query(tar,l,m,cur*2);
//  if(tar >= m+1) res += query(tar,m+1,r,cur*2+1);
//  return res;if(tar <=m) {if(tar >= tree[cur*2].r-tree[cur*2].right + 1) return tree[cur*2].right + tree[cur*2+1].left;else return query(tar,l,m,cur*2);}else {if(tar <= tree[cur*2+1].l + tree[cur*2+1].left -1) return tree[cur*2+1].left + tree[cur*2].right;else return query(tar,m+1,r,cur*2+1);}}
int main()
{int n,m;int tmp;char op[3];while(~scanf("%d%d",&n,&m) ) {while(!sk.empty() ) sk.pop();build(1,n,1);//0摧毁,1修复 while(m--) {scanf("%s",op);if(op[0] == 'D') {scanf("%d",&tmp);update1(tmp,0,1,n,1);sk.push(tmp);}else if(op[0] == 'R') {if(sk.empty() ) continue;tmp = sk.top();sk.pop();update1(tmp,1,1,n,1);}//询问 else {scanf("%d",&tmp);int x = query(tmp,1,n,1);
//              printf("%d   %d   %d\n",tree[3].left,tree[3].right,tree[3].all);printf("%d\n",x);}} }return 0 ;} //19:30 

【HDU - 1540】 Tunnel Warfare (线段树进阶操作 区间合并+ 单点更新+ 最长覆盖区间查询 )相关推荐

  1. hdu 1540 Tunnel Warfare(线段树区间合并)

    hdu 1540 Tunnel Warfare 记录每个节点的最大左连续值.最大右连续值.最大连续值,向上更新的是常规的区间合并处理方式 关键是想到如何去查询,如果查询节点落在左儿子节点的右连续段中, ...

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

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

  3. HDU - 1540 Tunnel Warfare(线段树+区间合并)

    题目链接:点击查看 题目大意:给定n个村庄,初始化全部连接为一条直线,需要依次执行m个操作,D表示摧毁第i个村庄的连接,R表示恢复最后一 个被摧毁的村庄的连接,Q表示询问包括本身在内,与第i个村庄相连 ...

  4. HDU 1540 Tunnel Warfare

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 解题思路:线段树节点增加一个ld----区间左端点起始的最大长度,rd----区间右端点起始的最 ...

  5. HDOJ1540 - Tunnel Warfare 线段树区间合并

    HDOJ 1540 题目大意:给定两个整数N,M, 其中N表示一共有N个村庄,M代表有M次操作,操作有以下: 1.    D x  销毁村庄x 2.    Q x  询问与村庄x相邻的村庄总数 3.  ...

  6. HDU-1540 Tunnel Warfare 线段树最大连续区间 或 STL巧解

    题目大意 n个点,m个操作(1<=n,m<=5e4),m行中每行一个字符c表示操作类型,一个整型数x表示第x个点 D x 表示去掉第x点,Q x表示需输出含 x 的最大连续区间的长度,R ...

  7. 数据结构之线段树进阶(区间更新lazy标记)

    之前说了线段树的点更新和区间求和.其实点更新是区间更新的一种最基础的做法.我们把一个点想像成一个区间的话,不就是最简单的区间更新了嘛. 为什么要把区间更新和点更新分开来看呢?假如我们对区间[l,r]进 ...

  8. hdu.3308 LCIS(线段树,区间合并+单点更新)

    按照傻崽大神的线段树修炼路线,自己做的第二道区间合并的题. 问题比较简单明了,区间求最长连续上升子序列,但是是需要单点更新的 n个数, m组操作 Q A B 询问[A,B]区间的最长连续上升子序列: ...

  9. 线段树应用:区间合并

    传送门luoguP2894 本题我们要维护最左边的值,考虑使用线段树维护.我们发现只用一个来存储当前的节点的值并不够,因为对于一个节点我们无法用一个来描述这整个区间哪些为空,哪些满了,例如查询的跨越了 ...

最新文章

  1. ​台媒:台积电2nm制程获重大突破
  2. visio 2010下载
  3. Brute Force STL --- UVA 146 ID Codes
  4. STM32 单片机启动流程
  5. 今天刚学的idea的debug打断点,Ctrl+u进入Evaluate Expression界面,调试程序事半功倍!
  6. 对 Entity 的初步构思
  7. Tensorflow实战系列之五:
  8. python 蓝牙模块pybluz安装
  9. 巴特沃斯滤波器python_如何用Scipy.signal.bu实现带通巴特沃斯滤波器
  10. Python正则表达式,看完这篇文章就够了...#华为云·寻找黑马程序员#
  11. Prototype(原型模式)
  12. Android 系统自带的图标
  13. ios人脸照片_iOS人脸识别
  14. IT运维审计系统是什么?有推荐的吗?
  15. Python入门到放弃
  16. 【历年IJCAI论文下载(含IJCAI2022)】图神经网络(GNN)(多行为推荐、多模态食谱表示学习、同质图表示学习)
  17. 2021年最具赚钱潜力的互联网项目?明年的你准备靠什么活着?
  18. 微信能用支付宝钱包了
  19. adguard拦截规则存在哪里_广告拦截软件Adguard怎样配置才能更全面的发挥作用
  20. 字符串专题-LeetCode:剑指 Offer 58 - II. 左旋转字符串、LeetCode 459.重复的子字符串、 代码思路和注意点

热门文章

  1. 【插件介绍】Lombok
  2. 602B. Approximating a Constant Range
  3. oracle 12c缩容磁盘组,oracle 表收缩
  4. matlab计算斜方差_计算一幅图像的信噪比
  5. oracle数据库领域,菜鸟成长课程之《Oracle数据库职业直通车》,引领大家真正进入Oracle数据库领域...
  6. mysql sql语句 入门_mysql(3)mysql的sql语句入门
  7. fpga摄像头模块_FPGA开源项目:双目测距(一)之双目图像采集显示以及图片保存...
  8. Linux设备树翻译计划
  9. extensions.conf的常用参数配置
  10. java中手动装入新类到类装饰器_关于java:抽象装饰器类中的功能而不是装饰器...