链接:http://acm.hdu.edu.cn/showproblem.php?pid=1540

思路:三种操作:

D摧毁一个点

R重建最晚被修改的那个点

Q询问点x联通的点有多少个

逆向思维,D操作可以看成在平衡树上建个点,R看成在平衡树上删除一个点,Q询问x联通点个数,我们就可以直接在平衡树上找x的前驱l和后继r,点的个数就是r - l - 1,特判下当x点也被摧毁了,那么联通点数量为0。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ls t[x].ch[0]
#define rs t[x].ch[1]
const int M = 6e5 + ;
const int inf = 0x3f3f3f3f;
map<int,int>mp;
int last[M],n,m,root,cnt;
struct node{
int ch[],cnt,siz,val,rd;
}t[M]; void up(int x){
t[x].siz = t[ls].siz + t[rs].siz+t[x].cnt;
} void rotate(int &x,int d){
int son = t[x].ch[d];
t[x].ch[d] = t[son].ch[d^];
t[son].ch[d^] = x; up(x); up(x=son);
} void Insert(int &x,int val){
if(!x){
x = ++cnt;
t[x].cnt = t[x].siz = ;
t[x].val = val,t[x].rd = rand();
return ;
}
t[x].siz ++;
if(t[x].val == val){
t[x].cnt++; return ;
}
int d = t[x].val < val; Insert(t[x].ch[d],val);
if(t[x].rd > t[t[x].ch[d]].rd) rotate(x,d);
} void del(int &x,int val){
if(!x) return ;
if(t[x].val == val){
if(t[x].cnt > ){
t[x].cnt--,t[x].siz--;return ;
}
bool d = t[ls].rd > t[rs].rd;
if(ls == ||rs == ) x = ls+rs;
else rotate(x,d),del(x,val);
}
else t[x].siz--,del(t[x].ch[t[x].val<val],val);
} int rk(int x,int val){
if(!x) return ;
if(t[x].val == val) return t[ls].siz+;
if(t[x].val > val) return rk(ls,val);
return rk(rs,val)+t[ls].siz+t[x].cnt;
} int kth(int root,int k){
int x = root;
while(){
if(k <= t[ls].siz) x = ls;
else if(k > t[ls].siz+t[x].cnt)
k -= t[ls].siz+t[x].cnt,x = rs;
else return t[x].val;
}
} int pre(int x,int val){
if(!x) return -inf;
if(t[x].val >= val) return pre(ls,val);
return max(pre(rs,val),t[x].val);
} int nex(int x,int val){
if(!x) return inf;
if(t[x].val <= val) return nex(rs,val);
return min(nex(ls,val),t[x].val);
} int main()
{
string op;
ios::sync_with_stdio();
cin.tie(); cout.tie();
while(cin>>n>>m){
int tot = ,l,r,x;root = ;
mp.clear();t[root].siz = ;
Insert(root,); Insert(root,n+);
for(int i = ;i <= m;i ++){
cin>>op;
if(op[]=='D'){
cin>>x;
if(mp[x] == ){
Insert(root,x);
mp[x] = ;
}
last[++tot] = x;
}
else if(op[] == 'R'){
if(!tot) continue;
del(root,last[tot]);
mp[last[tot]] = ;
tot--;
}
else{
cin>>x;
l = pre(root,x);
r = nex(root,x);
if(mp[x] == ) l = r;
// cout<<l<<" "<<r<<endl;
cout<<max(r-l-,)<<endl;
}
}
}
}

hdu 1540 Tunnel Warfare(Treap)的更多相关文章

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

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 题目大意:抗日战争期间进行地道战,存在n个村庄用地道连接,输入D表示破坏某个村庄(摧毁与其相连的地道, 包 ...

  2. hdu 1540 Tunnel Warfare (线段树,维护当前最大连续区间)

    Description During the War of Resistance Against Japan, tunnel warfare was carried out extensively i ...

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

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

  4. HDU 1540 Tunnel Warfare (线段树)

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

  5. hdu 1540 Tunnel Warfare(线段树)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1540 题意:D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. ...

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

    https://cn.vjudge.net/problem/HDU-1540 题意 D代表破坏村庄,R代表修复最后被破坏的那个村庄,Q代表询问包括x在内的最大连续区间是多少. 分析 线段树的区间内,我 ...

  7. HDU 1540 Tunnel Warfare(最长连续区间 基础)

    校赛,还有什么途径可以申请加入ACM校队?  Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/ ...

  8. hdu 1540 Tunnel Warfare (区间线段树(模板))

    http://acm.hdu.edu.cn/showproblem.php?pid=1540 Tunnel Warfare Time Limit: 4000/2000 MS (Java/Others) ...

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

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

随机推荐

  1. python线程中的全局变量与局部变量

    在python多线程开发中,全局变量是多个线程共享的数据,局部变量是各自线程的,非共享的. 如下几种写法都是可以的: 第一种:将列表当成参数传递给线程 from threading import Th ...

  2. Python-待

    内置函数总结 https://www.cnblogs.com/jason-lv/p/8243141.html https://www.cnblogs.com/pyyu/p/6702896.html 数 ...

  3. Python入门-字符串常用方法

    Python 字符串 字符串是 Python 中最常用的数据类型.我们可以使用引号('或")来创建字符串. 创建字符串很简单,只要为变量分配一个值即可. var1 = 'Hello Worl ...

  4. P124黎曼可积性刻画 的两个备注

    1.这里为什么是开集?   2.请问为什么说了是开集马上就说是有界可测函数? 开集为可测集

  5. 会议室预订系统(meeting room booking system)

    一.mrbs mrbs:(meeting room booking system) 二.效果   三.models from django.db import models # Create your ...

  6. Python之切片操作

    1.列表list中使用 1.range()生成器 就是list取值的一种方式. 生成器range(),用于写列表的范围,如果只写一个数,就表示从0开始,到写入的值-1: l=list(range(10 ...

  7. Golang开发工具LiteIDE使用方法整理

    安装 参考github的说明 添加GOPATH 创建workspace 创建新文件 运行程序 Liteide中运行程序有两种方式: FR(FileRun)是编译并运行单个文件,可以使用Shift + ...

  8. PyCharm3.0默认快捷键

    PyCharm3.0默认快捷键(翻译的) 1.编辑(Editing) Ctrl + Space 基本的代码完成(类.方法.属性) Ctrl + Alt + Space 快速导入任意类 Ctrl + S ...

  9. Redis事物

    redis事物定义: >Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他客户端发送来的命令请求所打断. >Redis事务的主要作 ...

  10. wiki 安装

    地址:https://www.jianshu.com/p/fb2574567eae