传送门

很神奇的一道题,可以用线段树搞,为了练习treap所以拿treap写了。

其实根据询问,删除那个标号就加入平衡树,然后找到最大的和最小的就好了。

一些很烦人的小细节。

 //POJ 2892
 //by Cydiater
 //2016.9.1
 #include <iostream>
 #include <cstdio>
 #include <cstdlib>
 #include <cstring>
 #include <string>
 #include <queue>
 #include <map>
 #include <ctime>
 #include <cmath>
 #include <iomanip>
 #include <algorithm>
 using namespace std;
 #define ll long long
 #define up(i,j,n)        for(int i=j;i<=n;i++)
 #define down(i,j,n)        for(int i=j;i>=n;i--)
 ;
 const int oo=0x3f3f3f3f;
 inline int read(){
     ,f=;
     ;ch=getchar();}
     +ch-';ch=getchar();}
     return x*f;
 }
 ,root=,destory_list[MAXN],top=,last_add,maxx,minn;
 char op;
 bool vis[MAXN];
 struct node{
     int leftt,rightt,v,rnd,siz,cnt;
 }t[MAXN];
 namespace solution{
     void updata(int k){
         t[k].siz=t[t[k].leftt].siz+t[t[k].rightt].siz+t[k].cnt;
     }
     void lefturn(int &k){
         int tt=t[k].rightt;t[k].rightt=t[tt].leftt;t[tt].leftt=k;
         t[tt].siz=t[k].siz;updata(k);k=tt;
     }
     void righturn(int &k){
         int tt=t[k].leftt;t[k].leftt=t[tt].rightt;t[tt].rightt=k;
         t[tt].siz=t[k].siz;updata(k);k=tt;
     }
     void insert(int &k,int x){
         ){
             k=++tol;t[k].leftt=t[k].rightt=;
             t[k].siz=;t[k].v=x;t[k].cnt=;
             t[k].rnd=rand();
             return;
         }
         t[k].siz++;
         if(x==t[k].v)t[k].cnt++;
         else if(x>t[k].v){
             insert(t[k].rightt,x);
             if(t[t[k].rightt].rnd<t[k].rnd)lefturn(k);
         }else if(x<t[k].v){
             insert(t[k].leftt,x);
             if(t[t[k].leftt].rnd<t[k].rnd)righturn(k);
         }
     }
     void del(int &k,int x){
         )    return;
         if(x==t[k].v){
             ){t[k].cnt--;return;}
             )k=t[k].leftt+t[k].rightt;
             else if(t[t[k].leftt].rnd<t[t[k].rightt].rnd){
                 righturn(k);
                 del(k,x);
             }else if(t[t[k].leftt].rnd>t[t[k].rightt].rnd){
                 lefturn(k);
                 del(k,x);
             }
         }else if(x<t[k].v){
             t[k].siz--;
             del(t[k].leftt,x);
         }else if(x>t[k].v){
             t[k].siz--;
             del(t[k].rightt,x);
         }
     }
     void query_delta(int k,int x){
         )return;
         if(t[k].v>=x&&t[k].v<maxx)maxx=t[k].v;
         if(t[k].v<=x&&t[k].v>minn)minn=t[k].v;
         if(x>t[k].v)query_delta(t[k].rightt,x);
         else        query_delta(t[k].leftt,x);
     }
     void slove(){
         N=read();M=read();
         memset(vis,,sizeof(vis));
         while(M--){
             scanf("%c",&op);
             if(op=='R'){
                 )continue;
                 last_add=destory_list[top--];
                 del(root,last_add);
                 scanf("\n");
                 continue;
             }
             num=read();
             if(op=='D'){insert(root,num);destory_list[++top]=num;}
             if(op=='Q'){
                 maxx=N+;minn=;
                 query_delta(root,num);
                 ");
                 );
             }
         }
     }
 }
 int main(){
     //freopen("input.in","r",stdin);
     using namespace solution;
     slove();
     ;
 }

POJ 2892 Tunnel Warfare的更多相关文章

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

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

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

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

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

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

  4. poj 2892 Tunnel Warfare(线段树)

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

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

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

  6. POJ 2892 Tunnel Warfare (SBT + stack)

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

  7. HDU 1540 POJ 2892 Tunnel Warfare

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

  8. POJ 2892 Tunnel Warfare(树状数组+二分)

    题目链接 二分求上界和下界,树状数组.注意特殊情况. #include <cstring> #include <cstdio> #include <string> ...

  9. 【POJ】2892 Tunnel Warfare

    [算法]平衡树(treap) [题解]treap知识见数据结构 在POJ把语言从G++换成C++就过了……??? #include<cstdio> #include<algorith ...

随机推荐

  1. AngularJS中实现无限级联动菜单(使用demo)

    昨天没来得及贴几个使用demo,今天补上,供有兴趣的同学参考 :) 1. 同步加载子选项demo2. 异步加载子选项demo3. 初始值回填demo4. 倒金字塔依赖demo directive的源代 ...

  2. hystrix-turbine 监控的使用

    1.   概述 Demo地址:http://git.oschina.net/zhou666/spring-cloud-7simple/tree/master/cloud-hystrix-turbine ...

  3. Code Review 五问五答

    Code Review 是什么? Code Review即代码审查,程序猿相互审核对方的代码. Code Review能获得什么好处? 提高代码可维护性 你写的代码不再只有编译器看了,你得写出审核人能 ...

  4. 项目规范性检测工具Lint

    项目规范性检测工具lint.bat 一.Lint基本概念介绍 Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通过它对Android工程源代码进行扫描和检查,可发 ...

  5. rhel7修改网卡命名规则

    1步:当安装完红帽RHEL7系统安装完成,您的网卡命名是这样的. 第2步:请编辑网卡的配置文件 将”/etc/sysconfig/network-scripts/ifcfg-eno16777736“的 ...

  6. php学习手记

    在学习常量的时候,一直觉得奇怪 为啥常量的时候总是有个“.”在常量的后面,经过学习现在得知该点是 相当于Java当中的“+”用于连接字符 <?php header("Content-t ...

  7. Beta版冲刺Day1

    会议讨论: 628:        已经成功实现了文件的上传功能,但是按钮的布局有点不好看.未完成的功能有:修改老师信息时候弹出小窗口进行修改. 601:        目前还在解决剩下的问题,比如将 ...

  8. iOS开发小技巧--即时通讯项目:消息发送框(UITextView)高度的变化; 以及UITextView光标复位的小技巧

    1.即时通讯项目中输入框(UITextView)跟随输入文字的增多,高度变化的实现 最主要的方法就是监听UITextView的文字变化的方法- (void)textViewDidChange:(UIT ...

  9. Javaweb容器的四种作用域

    几乎所有web应用容器都提供了四种类似Map的结构:application session request page,Jsp或者Servlet通过向着这四个对象放入数据,从而实现Jsp和Servlet ...

  10. ajax技术应用(转)

    ajax简介 AJAX即"Asynchronous Javascript And XML"(异步JavaScript和XML),是指一种创建交互式网页应用的网页开发技术.Ajax不 ...