Tunnel Warfare
Time Limit: 1000MS   Memory Limit: 131072K
Total Submissions: 7725   Accepted: 3188

Description

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 nextm lines describes an event.

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

  1. D x: The x-th village was destroyed.
  2. Q x: The Army commands requested the number of villages that x-th village was directly or indirectly connected with including itself.
  3. 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

Hint

An illustration of the sample input:

      OOOOOOO

D 3   OOXOOOO

D 6   OOXOOXO

D 5   OOXOXXO

R     OOXOOXO

R     OOXOOOO

Source

这题被用作学平衡树的模板题,用的是treap。将被删除的村庄存入treap,若修复则删除,求连续序列用find函数。
#include<ctime>
#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
int n,m,root=0,d[50100],st,ed,sz;
struct Treap{int rnd,v,w,l,r;}tr[80100];
inline void lturn(int &k)
{
int t=tr[k].r;
tr[k].r=tr[t].l;
tr[t].l=k;
k=t;
}
inline void rturn(int &k)
{
int t=tr[k].l;
tr[k].l=tr[t].r;
tr[t].r=k;
k=t;
}
inline void insert(int &w,int x)
{
if(w==0){
sz++;
w=sz;
tr[w].v=x;
tr[w].w=1;
tr[w].rnd=rand();
return;
}
if(tr[w].v==x){
tr[w].w++;
return;
}
if(tr[w].v>x){
insert(tr[w].l,x);
if(tr[tr[w].l].rnd<tr[w].rnd)rturn(w);
}
else{
insert(tr[w].r,x);
if(tr[tr[w].r].rnd<tr[w].rnd)lturn(w);
}
}
inline void del(int &w,int x)
{
if(tr[w].v==x){
if(tr[w].w>1){tr[w].w--;return;}
if(tr[w].l*tr[w].r==0)w=tr[w].l+tr[w].r;
else{
if(tr[tr[w].l].rnd<tr[tr[w].r].rnd){
rturn(w);
del(w,x);}
else{
lturn(w);
del(w,x);}
}
return;
}
else if(tr[w].v<x)del(tr[w].r,x);
else del(tr[w].l,x);
}
inline void find(int &w,int x)
{
if(w==0)return;
if(tr[w].v>=x&&tr[w].v<ed)ed=tr[w].v;
if(tr[w].v<=x&&tr[w].v>st)st=tr[w].v;
if(tr[w].v<x)find(tr[w].r,x);
else find(tr[w].l,x);
}
int main()
{
srand(time(0));
scanf("%d%d",&n,&m);
char od;
int a;
for(int i=1,j=0;i<=m;i++){
cin>>od;
if(od=='D'){
scanf("%d",&a);
insert(root,a);
j++;
d[j]=a;
}
if(od=='R'){
del(root,d[j]);
j--;
}
if(od=='Q'){
scanf("%d",&a);
st=0,ed=n+1;
find(root,a);
if(st==a&&ed==a)puts("0");
else printf("%d\n",ed-st-1);
}
}
return 0;
}

poj 2892的更多相关文章

  1. POJ 2892 Tunnel Warfare

    传送门 很神奇的一道题,可以用线段树搞,为了练习treap所以拿treap写了. 其实根据询问,删除那个标号就加入平衡树,然后找到最大的和最小的就好了. 一些很烦人的小细节. //POJ 2892 / ...

  2. POJ 2892 Tunnel Warfare(线段树单点更新区间合并)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7876   Accepted: 3259 D ...

  3. HDU 1540 / POJ 2892 Tunnel Warfare (单点更新,区间合并,求包含某点的最大连续个数)

    题意:一条线上有n个点,D x是破坏这个点,Q x是表示查询x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 思路:这题的关键是查询. 将被毁的村庄看成空位,当查询某个点的时候,如果我们知道它左 ...

  4. hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】

    Tunnel Warfare                                                             Time Limit: 4000/2000 MS ...

  5. poj 2892 &&hdu 1540 Tunnel Warfare

    http://poj.org/problem?id=2892 #include <cstdio> #include <cstring> #include <algorit ...

  6. poj 2892 Tunnel Warfare(线段树)

    Tunnel Warfare Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 7499   Accepted: 3096 D ...

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

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

  8. POJ 2892 Tunnel Warfare (SBT + stack)

    题意:给定了初始的状态:有n个村庄连成一条直线,现在有三种操作: 1.摧毁一个村庄 2.询问某个村庄,输出与该村庄相连的村庄数量(包括自己) 3.修复被摧毁的村庄,优先修复最近被摧毁的........ ...

  9. HDU 1540 POJ 2892 Tunnel Warfare

    线段树 区间合并 单点修改 区间查询.又是1秒钟构思,差错查了好久... ... 发现一个int型的定义成了char型,打脸. #include <stdio.h> #include &l ...

随机推荐

  1. iOS/Android网络消息推送的实现两种方法

    移动时代,用户为王,而每个APP拥有的活跃用户量(Active Users),决定了其价值. 消息推送成为了不可或缺的活跃唤起工具. 目前消息推送有如下两种途径: 1.iOS传统方式: 通过Apple ...

  2. EXCEL快速自动填充方法集锦

    EXCEL快速自动填充方法集锦 原文地址,转载请注明:http://www.cnblogs.com/croso/p/5396841.html 方法一: 名称框输入a1:a1000回车,1, ctrl+ ...

  3. Android Content Provider Guides

    Android Content Provider Guides Content Providers管理对结构化数据集的访问.它们包装数据,并且提供一种定义数据安全的机制. Content provid ...

  4. JNI输出log信息

    1.修改Android.mk 如生成的库文件是“.so文件”,则在Android.mk中添加如下内容: LOCAL_LDLIBS:=-L$(SYSROOT)/usr/lib -llog 如生成的库文件 ...

  5. Android Activity动画

    动画XML文件 slide_right_in.xml <?xml version="1.0" encoding="utf-8"?> <set ...

  6. Android消息机制入门

    接着处理<Android 网络图片查看器>中出现的问题 使用添加子线程,修改原程序: package com.wuyudong.imagesviewer; import java.io.I ...

  7. 【代码笔记】iOS-看图听故事

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> #import <AVFoundation/AVFo ...

  8. 学习Coding-iOS开源项目日志(三)

    继续前两篇,接着本第三篇<学习Coding-iOS开源项目日志(三)>讲解Coding-iOS开源项目. 前 言:作为初级程序员,想要提高自己的水平,其中一个有效的学习方法就是学习别人好的 ...

  9. iOS事件响应链

    首先,当发生事件响应时,必须知道由谁来响应事件.在IOS中,由响应者链来对事件进行响应,所有事件响应的类都是UIResponder的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获 ...

  10. php示例代码之使用MySQLi接口

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 3 ...