【算法】平衡树(treap)

【题解】treap知识见数据结构

在POJ把语言从G++换成C++就过了……???

#include<cstdio>
#include<algorithm>
#include<ctime>
using namespace std;
const int maxn=;
struct cyc{int num,w,rnd,l,r;}t[maxn*];
int n,m,root,sz,s,tt,d[maxn];
void rr(int &tt)//右旋
{
int k=t[tt].l;
t[tt].l=t[k].r;
t[k].r=tt;
tt=k;
}
void lr(int &tt)
{
int k=t[tt].r;
t[tt].r=t[k].l;
t[k].l=tt;
tt=k;
}
void insert(int &w,int x)
{
if(w==)
{
w=++sz;
t[w].num=x;
t[w].w=;
t[w].rnd=rand();
return;
}
if(t[w].num==x){t[w].w++;return;};
if(x<t[w].num)
{
insert(t[w].l,x);
if(t[t[w].l].rnd<t[w].rnd)rr(w);
}
if(x>t[w].num)
{
insert(t[w].r,x);
if(t[t[w].r].rnd<t[w].rnd)lr(w);
}
}
void del(int &w,int x)
{
if(t[w].num==x)
{
if(t[w].w>)
{
t[w].w--;
return;
}
if(t[w].l*t[w].r==)w=t[w].l+t[w].r;//如果只有一颗子树,用这颗子树代替这个节点就可以删除了(没有子树则是用0代替之)。
else
if(t[t[w].l].rnd<t[t[w].r].rnd)
{
rr(w);
// del(t[w].r,x);
del(w,x);
}
else
{
lr(w);
// del(t[w].l,x);
del(w,x);
}
}
else if(t[w].num<x)del(t[w].r,x);
else del(t[w].l,x);
}
void find(int w,int x)
{
if(w==)return;
if(t[w].num>=x&&t[w].num<tt)tt=t[w].num;
if(t[w].num<=x&&t[w].num>s)s=t[w].num;
if(t[w].num>x)find(t[w].l,x);
if(t[w].num<x)find(t[w].r,x);
}
int main()
{
srand(time());
scanf("%d%d",&n,&m);
for(int i=,j=;i<=m;i++)
{
// printf("[]");
char c=getchar();int x;
c=getchar();//printf("[c=%c]",c);
// while(c<'A'&&c>'Z')c=getchar();
if(c=='D')
{
scanf("%d",&x);
insert(root,x);
d[++j]=x;
}
if(c=='R')del(root,d[j--]);
if(c=='Q')
{
s=,tt=n+;
scanf("%d",&x);
find(root,x);
if(s==tt)printf("0\n");
else printf("%d\n",tt-s-);
}
}
return ;
}

【POJ】2892 Tunnel Warfare的更多相关文章

  1. 【HDOJ】1540 Tunnel Warfare

    还不错的一道线段树区间合并.挺巧妙的用法. /* 1540 */ #include <iostream> #include <string> #include <map& ...

  2. 【POJ】1704 Georgia and Bob(Staircase Nim)

    Description Georgia and Bob decide to play a self-invented game. They draw a row of grids on paper, ...

  3. 【POJ】1067 取石子游戏(博弈论)

    Description 有两堆石子,数量任意,可以不同.游戏开始由两个人轮流取石子.游戏规定,每次有两种不同的取法,一是可以在任意的一堆中取走任意多的石子:二是可以在两堆中同时取走相同数量的石子.最后 ...

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

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

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

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

  6. poj 2892 Tunnel Warfare(线段树)

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

  7. 【BZOJ】【1986】【USACO 2004 Dec】/【POJ】【2373】划区灌溉

    DP/单调队列优化 首先不考虑奶牛的喜欢区间,dp方程当然是比较显然的:$ f[i]=min(f[k])+1,i-2*b \leq k \leq i-2*a $  当然这里的$i$和$k$都是偶数啦~ ...

  8. 【POJ】【2104】区间第K大

    可持久化线段树 可持久化线段树是一种神奇的数据结构,它跟我们原来常用的线段树不同,它每次更新是不更改原来数据的,而是新开节点,维护它的历史版本,实现“可持久化”.(当然视情况也会有需要修改的时候) 可 ...

  9. 【POJ】1222 EXTENDED LIGHTS OUT

    [算法]高斯消元 [题解] 高斯消元经典题型:异或方程组 poj 1222 高斯消元详解 异或相当于相加后mod2 异或方程组就是把加减消元全部改为异或. 异或性质:00 11为假,01 10为真.与 ...

随机推荐

  1. 用URL传参带特殊字符,特殊字符丢失

    文章:URL中编码URL特殊字符 文章:用URL传参带特殊字符,特殊字符丢失(encode) 如果url中有特殊字符,需要对url进行编码,否则特殊字符丢失,导致最终接收到的值不对.

  2. mysql入门 — (1)

    使用cd进入到mysql/bin文件夹下面,或者配置完环境之后,直接在cmd中使用mysql,然后回车开启mysql. 登录 为了安全考虑,在这里只设置了本地root用户可以连接上数据库.使用的指令是 ...

  3. 菜鸟的飞翔日记-os篇

    一轮王道os复习感想 1概述 虽然去年有上操作系统这门必修课,考的成绩也算理想,本来还有点沾沾自喜,嗯,觉得自己学的还不错,知道有一天我拿起了王道,(没给王道打广告)看王道的原因完全在于为考研做准备, ...

  4. 敏捷冲刺Day1

    前言: 之前的各种对教务系统的分析,再加上我们两三天的讨论和一个小时的站立会议,我们做出最终的决定.--我们决定换个项目主题,将原来的教务辅助系统换成现在的校园帮帮帮服务,并在之后会将完成后的计划书附 ...

  5. docker使用记录

    1.安装(开始前要注意系统内核版本是否合适,建议用7以上的系统吧,少点坑) //安装docker yum -y install docker-io //启动 service docker start ...

  6. change object keys & UpperCase & LowerCase

    change object keys & UpperCase & LowerCase .toLocaleUpperCase(); && .toLocaleLowerCa ...

  7. [C/C++] C++类对象创建问题

    CSomething a();// 没有创建对象,这里不是使用默认构造函数,而是定义了一个函数,在C++ Primer393页中有说明. CSomething b(2);//使用一个参数的构造函数,创 ...

  8. 【EF】EF实现大批量数据库插入操作

    通过参考http://www.itnose.net/news/171/6306259里面介绍的方法,我们可以在程序的解决方案的引用中选择NuGet管理包中添加  该扩展方法提供BulkInsert() ...

  9. poj 1469 COURSES (二分匹配)

    COURSES Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 16877   Accepted: 6627 Descript ...

  10. Python程序性能分析模块----------cProfile

    cProfile分析器可以用来计算程序整个运行时间,还可以单独计算每个函数运行时间,并且告诉你这个函数被调用多少次 def foo(): pass import cProfile cProfile.r ...