POJ 2892 Tunnel Warfare
很神奇的一道题,可以用线段树搞,为了练习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的更多相关文章
- POJ 2892 Tunnel Warfare(线段树单点更新区间合并)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7876 Accepted: 3259 D ...
- hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】
Tunnel Warfare Time Limit: 4000/2000 MS ...
- HDU 1540 / POJ 2892 Tunnel Warfare (单点更新,区间合并,求包含某点的最大连续个数)
题意:一条线上有n个点,D x是破坏这个点,Q x是表示查询x所在的最长的连续的点的个数,R是恢复上一次破坏的点. 思路:这题的关键是查询. 将被毁的村庄看成空位,当查询某个点的时候,如果我们知道它左 ...
- poj 2892 Tunnel Warfare(线段树)
Tunnel Warfare Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 7499 Accepted: 3096 D ...
- POJ 2892 Tunnel Warfare || HDU 1540(树状数组+二分 || 线段树的单点更新+区间查询)
点我看题目 题意 :N个村子连成一条线,相邻的村子都有直接的地道进行相连,不相连的都由地道间接相连,三个命令,D x,表示x村庄被摧毁,R ,表示最后被摧毁的村庄已经重建了,Q x表示,与x直接或间 ...
- POJ 2892 Tunnel Warfare (SBT + stack)
题意:给定了初始的状态:有n个村庄连成一条直线,现在有三种操作: 1.摧毁一个村庄 2.询问某个村庄,输出与该村庄相连的村庄数量(包括自己) 3.修复被摧毁的村庄,优先修复最近被摧毁的........ ...
- HDU 1540 POJ 2892 Tunnel Warfare
线段树 区间合并 单点修改 区间查询.又是1秒钟构思,差错查了好久... ... 发现一个int型的定义成了char型,打脸. #include <stdio.h> #include &l ...
- POJ 2892 Tunnel Warfare(树状数组+二分)
题目链接 二分求上界和下界,树状数组.注意特殊情况. #include <cstring> #include <cstdio> #include <string> ...
- 【POJ】2892 Tunnel Warfare
[算法]平衡树(treap) [题解]treap知识见数据结构 在POJ把语言从G++换成C++就过了……??? #include<cstdio> #include<algorith ...
随机推荐
- Word Excel 操作总结
1.与office无关使用 Aspose.Cells.dll,Aspose.Words.dll 2.使用Microsoft.Office.Interop.Excel Microsoft.Office. ...
- dinic模板
procedure addedge(u,v,cap:longint); begin sid[tot].u:=u; sid[tot].v:=v; sid[tot].cap:=cap; sid[tot]. ...
- 图片上传和显示——上传图片——上传文件)==ZJ
http://www.cnblogs.com/yc-755909659/archive/2013/04/17/3026409.html aspx上传 http://www.cnblogs.com/mq ...
- js正则表单验证汇总,邮箱验证,日期验证,电话号码验证,url验证,信用卡验证,qq验证
本文主要汇总各种正则验证,很多都是转载,本人也会尽可能验证准确性,如有错误欢迎留言 //trim()方法在有些浏览器中不兼容,最好自己重写一下 String.prototype.trim=functi ...
- 网页倒计时,动态显示"××年还剩××天××时××分××秒"
var target = document.getElementById('target'); function getTimeString(){ // 要计算任意两个日期的时间差只要修改curren ...
- 【转】关于Class.forName(“com.mysql.jdbc.Driver”)
原文:http://www.cnblogs.com/gaojing/archive/2012/03/23/2413638.html 传统的使用jdbc来访问数据库的流程为: Class.forName ...
- python2.7到python3代码转换脚本2to3的一些介绍
你的位置: Home ‣ Dive Into Python 3 ‣ 难度等级: ♦♦♦♦♦ 使用2to3将代码移植到Python 3 ❝ Life is pleasant. Death is ...
- 35-less 简明笔记
分屏显示文本文件 less [options] [file-list] less与more类似,但比more更加完善 例如:在显示一屏文本之后,less将显示提示副等待下一条命令的输入;可以向前或向后 ...
- Linq的TakeWhile误用
where(func<>)返回符合条件的元素 与此相对的skipwhile跳过符合条件的,返回剩下的元素 容易误用的takewhile,与where 不一样,只有当所有元素满足条件时,才返 ...
- linux android真机测试
1. 在终端运行 lsusb 会发现结果有会有如下类似记录: Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 ...