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

思路:

类似这题:(可以一起做了,)

https://www.cnblogs.com/qieqiemin/p/11385427.html

线段树处理连续区间的经典问题。

我们定义一个节点被轰炸为0,没被轰炸为1.

线段树每一个区间维护以下信息:

1、从左端点开始的最长连续1的个数。

2、从右端点开始的最长连续1的个数。

3、整个区间的最长连续1的个数。

4、是否整个区间是否都为1。

具体的转移和pushup看代码即可。

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 50010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
struct node
{
int l,r;
int num;
int isall;
int lm,rm;
}segmeng_tree[maxn<<2];
int n;
int m;
void pushup(int rt)
{
if(segmeng_tree[rt<<1].isall)
{
segmeng_tree[rt].isall=segmeng_tree[rt<<1|1].isall;
segmeng_tree[rt].lm=segmeng_tree[rt<<1].lm+segmeng_tree[rt<<1|1].lm;
if(segmeng_tree[rt<<1|1].isall)
segmeng_tree[rt].rm=segmeng_tree[rt<<1|1].rm+segmeng_tree[rt<<1].rm;
else
segmeng_tree[rt].rm=segmeng_tree[rt<<1|1].rm;
segmeng_tree[rt].num=max(segmeng_tree[rt].lm,segmeng_tree[rt].rm);
segmeng_tree[rt].num=max(segmeng_tree[rt].num,segmeng_tree[rt<<1].rm+segmeng_tree[rt<<1|1].lm);
}else if(segmeng_tree[rt<<1|1].isall)
{
segmeng_tree[rt].isall=segmeng_tree[rt<<1].isall;
segmeng_tree[rt].rm=segmeng_tree[rt<<1|1].rm+segmeng_tree[rt<<1].rm;
if(segmeng_tree[rt<<1].isall)
segmeng_tree[rt].lm=segmeng_tree[rt<<1|1].lm+segmeng_tree[rt<<1].lm;
else
segmeng_tree[rt].lm=segmeng_tree[rt<<1].lm;
segmeng_tree[rt].num=max(segmeng_tree[rt].lm,segmeng_tree[rt].rm);
segmeng_tree[rt].num=max(segmeng_tree[rt].num,segmeng_tree[rt<<1].rm+segmeng_tree[rt<<1|1].lm);
}else
{
segmeng_tree[rt].isall=0;
segmeng_tree[rt].lm=segmeng_tree[rt<<1].lm;
segmeng_tree[rt].rm=segmeng_tree[rt<<1|1].rm;
segmeng_tree[rt].num=max(segmeng_tree[rt].lm,segmeng_tree[rt].rm);
segmeng_tree[rt].num=max(segmeng_tree[rt].num,segmeng_tree[rt<<1].rm+segmeng_tree[rt<<1|1].lm);
}
}
void build(int rt,int l,int r)
{
segmeng_tree[rt].l=l;
segmeng_tree[rt].r=r;
if(l==r)
{
segmeng_tree[rt].num=segmeng_tree[rt].lm=segmeng_tree[rt].rm=segmeng_tree[rt].isall=1;
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
} void update(int rt,int x,int val)
{
if(segmeng_tree[rt].l==segmeng_tree[rt].r)
{
if(val)
{
segmeng_tree[rt].isall=1;
}else
{
segmeng_tree[rt].isall=0;
}
segmeng_tree[rt].lm=segmeng_tree[rt].rm=segmeng_tree[rt].num=val;
}else
{
int mid=(segmeng_tree[rt].l+segmeng_tree[rt].r)>>1;
if(x<=mid)
{
update(rt<<1,x,val);
}else
{
update(rt<<1|1,x,val);
}
pushup(rt);
}
}
int ask(int rt,int x)
{
if(segmeng_tree[rt].l==segmeng_tree[rt].r||segmeng_tree[rt].isall||segmeng_tree[rt].num==0)
{
return segmeng_tree[rt].num;
}
int mid=(segmeng_tree[rt].l+segmeng_tree[rt].r)>>1;
if(x<=mid)
{
if(segmeng_tree[rt<<1].r-segmeng_tree[rt<<1].rm+1<=x)
{
return ask(rt<<1,x)+ask(rt<<1|1,mid+1);
}else
{
return ask(rt<<1,x);
}
}else
{
if(segmeng_tree[rt<<1|1].l+segmeng_tree[rt<<1|1].lm-1>=x)
{
return ask(rt<<1|1,x)+ask(rt<<1,mid);
}else
{
return ask(rt<<1|1,x);
}
}
}
stack<int> st;
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
while(~scanf("%d %d",&n,&m))
{
build(1,1,n);
while(!st.empty())
{
st.pop();
}
char s[22];
while(m--)
{
scanf("%s",s);
int x;
if(s[0]=='D')
{
scanf("%d",&x);
update(1,x,0);
st.push(x);
}else if(s[0]=='Q')
{
scanf("%d",&x);
printf("%d\n",ask(1,x));
}else
{
if(st.size())
{
x=st.top();
st.pop();
update(1,x,1);
}
}
}
}
return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

Tunnel Warfare HDU - 1540 (线段树处理连续区间问题)的更多相关文章

  1. I - Tunnel Warfare HDU - 1540 线段树最大连续区间

    题意  :一段区间  操作1 切断点 操作2 恢复最近切断的一个点 操作3 单点查询该点所在最大连续区间 思路:  主要是push_up :  设区间x 为母区间  x<<1 ,x< ...

  2. POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)

    点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R  ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...

  3. E - Tunnel Warfare HDU - 1540 F - Hotel G - 约会安排 HDU - 4553 区间合并

    E - Tunnel Warfare HDU - 1540 对这个题目的思考:首先我们已经意识到这个是一个线段树,要利用线段树来解决问题,但是怎么解决呢,这个摧毁和重建的操作都很简单,但是这个查询怎么 ...

  4. Tunnel Warfare HDU 1540 区间合并+最大最小值

    Tunnel Warfare HDU 1540 区间合并+最大最小值 题意 D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 题解思路 参考的大佬博客 这里 ...

  5. Tunnel Warfare HDU - 1540(线段树最长连续区间)

    题意: 一条线上的点,D x是破坏这个点,Q x是表示查询以x所在的最长的连续的点的个数,R是恢复上一次破坏的点.   解析: 线段树结点 设置一个  lq记录区间左端点开始的最大连续个数,  rq ...

  6. Tunnel Warfare(hdu1540 线段树)

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

  7. Tunnel Warfare(HDU1540+线段树+区间合并)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目: 题意:总共有n个村庄,有q次操作,每次操作分为摧毁一座村庄,修复一座村庄,和查询与询问的 ...

  8. HDU - 1540 线段树的合并

    这个题题意我大概解释一下,就是一开始一条直线,上面的点全是联通的,有三种操作 1.操作D把从左往右第x个村庄摧毁,然后断开两边的联通. 2.询问Q节点相联通的最长长度 3.把最后破坏的村庄重建. 这个 ...

  9. hdu 1540 线段树

    这题的意思是现在有一些村庄成一条直线排列,现在有三个操作,D:摧毁一个指定的村庄,Q:询问与指定村庄相连的村庄个数, 就是这个村庄向左和向右数村庄数量,遇到尽头或损坏的村庄为止,这个就是与这个村庄相连 ...

随机推荐

  1. SVN 服务器 配置

    1.目录结构 2.用户分配 3.目录权限 4.linux下的SVN服务器 5.配置svnserver.conf 注意左边不要有空格 注意文件的权限 chmod -R 777 /opt/svn/blue ...

  2. python安装第三方库报错:Cannot uninstall '***'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

    pip install --ignore-installed ${PACKAGE_NAME}

  3. Linux中脚本运行错误(坏的解释器:没有那个文件或目录)

    原因: 在Linux中有时候我们将在Windows下编写的脚本拷贝到Linux环境中运行时会出现运行不了的情况. 主要还是Windows的换行符为\r\n,而Linux环境中的换行符号为\n. 解决办 ...

  4. 【FFMPEG】各种音视频编解码学习详解 h264 ,mpeg4 ,aac 等所有音视频格式

    目录(?)[-] 编解码学习笔记二codec类型 编解码学习笔记三Mpeg系列Mpeg 1和Mpeg 2 编解码学习笔记四Mpeg系列Mpeg 4 编解码学习笔记五Mpeg系列AAC音频 编解码学习笔 ...

  5. 深入理解C语言-深入理解指针

    关于指针,其是C语言的重点,C语言学的好坏,其实就是指针学的好坏.其实指针并不复杂,学习指针,要正确的理解指针. 指针是一种数据类型 指针也是一种变量,占有内存空间,用来保存内存地址 指针就是告诉编译 ...

  6. Guava源码阅读-base-Strings

    package com.google.common.base; 今天阅读的是Srings类,这在程序中经常使用. 比如判断字符串是否为空,我们在之前用jdk方法判断是会用下面这个判断语句. if( i ...

  7. Android ConstraintLayout 说明和例子

    快速说明 当我们点击一个按钮时,显示效果如下 Baseline的显示需要右键该控件,然后 约束类型 尺寸约束 实心方块,用来调整组件的大小 边界约束 空心圆圈,建立组件之间,组件和parent的约束关 ...

  8. Squares of a Sorted Array

    Given an array of integers A sorted in non-decreasing order, return an array of the squares of each ...

  9. 洛谷 P2018 消息传递 题解

    题面 总体来说是一道从下往上的DP+贪心: 设f[i]表示将消息传给i,i的子树全部接收到所能消耗的最小时间: 那么对于i的所有亲儿子节点j,我们会贪心地先给f[j]大的人传递,然后次大..... 可 ...

  10. 前端 CSS 2

    无序列表去除自带的样式 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...