想试下新找的板子,没想到交上去CE了。。懒得调。。以后有机会就改

/*
用type标记当前树上的是宠物还是人
每次求前驱后缀,删掉最近的那个点
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define maxn 1000100
#define L ch[r][0]
#define R ch[r][1]
#define KT ch[ch[r][1]][0] struct Splay{
int pre[maxn],sz[maxn],ch[maxn][],val[maxn],rt,tot;
int flag;
inline void newnode(int &r,int fa,int key){
r=++tot;
L=R=;
pre[r]=fa;
val[r]=key;
sz[r]=;
sz[L]=sz[R]=;
}
inline void pushup(int r){
sz[r]=;
if(L) sz[r]+=sz[L];
if(R) sz[r]+=sz[R];
}
inline void init(){//加两个边界
rt=tot=flag=;
ch[rt][]=ch[rt][]=sz[rt]=pre[rt]=;
newnode(rt,,-);
newnode(ch[rt][],rt,);
memset(sz,,sizeof sz);
}
inline void rotate(int x,int f) {
int y=pre[x];
ch[y][!f] = ch[x][f];
pre[ ch[x][f] ] = y;
pre[x] = pre[y];
if(pre[x]) ch[ pre[y] ][ ch[pre[y]][] == y ] =x;
ch[x][f] = y;
pre[y] = x;
pushup(y);
}
inline void splay(int x,int goal) { //将x旋转到goal的下面
while(pre[x] != goal) {
if(pre[pre[x]] == goal) rotate(x , ch[pre[x]][] == x);
else {
int y=pre[x],z=pre[y];
int f = (ch[z][]==y);
if(ch[y][f] == x) rotate(x,!f),rotate(x,f);
else rotate(y,f),rotate(x,f);
}
}
pushup(x);
if(goal==) rt=x;
} inline void insert(int &r,int key,int fa){
if(!r){newnode(r,fa,key);splay(r,);return;}
else if(key<val[r]) insert(L,key,r);
else insert(R,key,r);
pushup(r);
}
inline int findkth(int r,int k){//找第k大的那个结点的值
if(k==sz[L]+) {splay(r,);return val[r];}
else if(k<sz[L]+)
return findkth(L,k);
else return findkth(R,k-sz[L]-);
}
inline int find(int r,int key){//找键值为key的结点
if(!r) return ;//不存在这个键值
else if(key==val[r]) return r;
else if(key<val[r]) find(L,key);
else find(R,key);
}
void remove(){
int t=rt;
if(ch[rt][]){//删掉根节点并以后缀作为根
rt=ch[rt][];
splay(getmin(rt),);
ch[rt][]=ch[t][];
if(ch[rt][]) pre[ch[rt][]]=rt;
}
else rt=ch[rt][];
pre[rt]=;
pushup(rt);
}
void findpre(int r,int key,int &ans){//找前驱结点(找值比key小的的最大的结点)
if(!r) return;
if(key>=val[r]) {ans=r;findpre(R,key,ans);}
else findpre(L,key,ans);
}
void findsucc(int r,int key,int &ans){///找后继
if(!r) return;
if(key<=val[r]) {ans=r;findsucc(L,key,ans);}
else findsucc(R,key,ans);
}
inline int getmin(int r){while(L) r=L;return r;}
inline int getmax(int r){while(R) r=R;return r;} inline void vist(int r){
if(r){
printf("结点%2d : 左儿子 %2d 右儿子 %2d val:%2d sz=%d\n",r,L,R,val[r],sz[r]);
vist(L);
vist(R);
}
}
void debug() {
puts("");
vist(rt);
puts("");
}
}spt;
int main(){
int n,a,b,ans;
while(scanf("%d",&n)==){
spt.init();
ans=;
for(int i=;i<=n;i++){
scanf("%d%d",&a,&b);
// spt.debug();
if(spt.sz[spt.rt]==){
spt.flag=a;
spt.insert(spt.rt,b,);
}
else {
if(spt.flag==a) spt.insert(spt.rt,b,);
else {
int tmp1,tmp2;
spt.findpre(spt.rt,b,tmp1);
spt.findsucc(spt.rt,b,tmp2);
if(abs(b-spt.val[tmp1])<=abs(b-spt.val[tmp2])){
ans+=abs(b-spt.val[tmp1]);
spt.splay(tmp1,);
spt.remove();
}
else {
ans+=abs(b-spt.val[tmp2]);
spt.splay(tmp2,);
spt.remove();
}
}
}
// spt.debug();
}
printf("%d\n",ans);
}
return ;
}

bzoj1208splay模板题的更多相关文章

  1. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  2. HDU 2222 AC自动机模板题

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...

  3. POJ2774 & 后缀数组模板题

    题意: 求两个字符串的LCP SOL: 模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing) 后缀数组概念...还算是简单的,过程 ...

  4. HDU 1251 Trie树模板题

    1.HDU 1251 统计难题  Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...

  5. HDU-3549 最大流模板题

    1.HDU-3549   Flow Problem 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 3.总结:模板题,参考了 http://ww ...

  6. HDU 4280:Island Transport(ISAP模板题)

    http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意:在最西边的点走到最东边的点最大容量. 思路:ISAP模板题,Dinic过不了. #include & ...

  7. HDU-2222 Keywords Search(AC自动机--模板题)

    题目大意:统计一共出现了多少次模板串. 题目分析:AC自动机的模板题.不过这题有坑,相同的模板串不能只算一次. 代码如下: # include<iostream> # include< ...

  8. Dancing Link --- 模板题 HUST 1017 - Exact cover

    1017 - Exact cover Problem's Link:   http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...

  9. AC自动机 - 多模式串匹配问题的基本运用 + 模板题 --- HDU 2222

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

随机推荐

  1. secure CRT the remote system refused the connection 解决办法

    1.安装ssh服务器和客户端 apt-get install openssh-server apt-get install openssh-client 2.重启ssh /etc/init.d/ssh ...

  2. canvas实现时钟

    最近在看新浪体育网球频道(http://sports.sina.com.cn/tennis/)的时候,看到了下面的劳力士广告的时钟是用canvas做的,于是也实现了一个简单的canvas时钟.直接上代 ...

  3. java实现获取当前年月日 小时 分钟 秒 毫秒

    java代码实现如下 view source print?     /**      * 英文简写(默认)如:2010-12-01      */     public static String F ...

  4. Codeforces 264 B. Good Sequences

    B. Good Sequences time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...

  5. 按某个属性排序(字典序,ascII) js/python

    javascrapy方法 var compare = (prop)=>{ return (a,b)=>{ : - } } javascrapy测试代码 var aaa = [ {name: ...

  6. .NET Framework 系统版本支持表

    .tg {border-collapse:collapse;border-spacing:0;border-color:#aabcfe;} .tg td{font-family:Arial, sans ...

  7. WF控制台工作流(1)

    简单使用WF工作流示例: using System; using System.Linq; using System.Activities; using System.Activities.State ...

  8. 计算机网络之互联网|因特网|万维网|HTTP|HTML之间的关系辨析

    本博文基于知乎"Web 是什么意思?"一问而引起.(本文均属于博主从知乎上自身所答搬运而至). 如无特殊声明,括号()内以分号分隔的名词均等效. 本文如无特殊引用声明,则所有内容版 ...

  9. JavaScript之函数式编程思想初探

    //result = 3*x + 5; var Mul3 = function(x){ return 3*x; } var Add5 = function(x){ return x + 5; } va ...

  10. 第15月第6天 ios UIScrollView不能响应TouchesBegin

    1. 1:@property MyScrollView *scrollView; 2:给MyScrollView,增加类别:MyScrollView+Touch 3:在类别里实现下面三个方法: @im ...