想试下新找的板子,没想到交上去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. Python新手入门英文词汇笔记(转)

    一.交互式环境与print输出 1.print:打印/输出2.coding:编码3.syntax:语法4.error:错误5.invalid:无效6.identifier:名称/标识符7.charac ...

  2. windows上使用mkdocs搭建静态博客

    windows上使用mkdocs搭建静态博客 之前尝试过用HEXO搭建静态博客,最近发现有个叫mkdocs的开源项目也是搭建静态博客的好选择,而且它支持markdown格式,下面简要介绍一下mkdoc ...

  3. Python XML操作

    XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据.在编程中,对XML的操作也非常常见. 本文根据python库文档中的xml.etree.ElementTree类来进行介绍X ...

  4. MQTT协议-MQTT协议解析(MQTT数据包结构)

    协议就是通信双方的一个约定,即,表示第1位传输的什么.第2位传输的什么…….在MQTT协议中,一个MQTT数据包由:固定头(Fixed header). 可变头(Variable header). 消 ...

  5. luogu P1641 [SCOI2010]生成字符串

    传送门 代码极短 \(O(n^2)\)dp是设\(f_{i,j,k}\)表示前\(i\)位,放了\(j\)个1,后面还可以接着放\(k\)个0的方案,转移的话,如果放0,\(k\)就要减1,反之放了1 ...

  6. 【centos】 error: command 'gcc' failed with exit status 1

    原文连接http://blog.csdn.net/fenglifeng1987/article/details/38057193 用安装Python模块出现error: command 'gcc' f ...

  7. Python3 configparse模块(配置)

    ConfigParser模块在python中是用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section),每个节可以有多个参数(键=值). 注意:在 ...

  8. 在全志平台调试博通的wifi驱动(类似ap6212)【转】

    转自:http://blog.csdn.net/fenzhi1988/article/details/44809779 调试驱动之前,首先先看看驱动代码,了解代码大致工作流程,再根据硬件配置驱动,比如 ...

  9. GetStockObject 理解

    原文地址:https://www.cnblogs.com/Clingingboy/archive/2013/04/13/3017952.html GetStockObject在图形编程中是常用API之 ...

  10. eclipse自动添加注释

    自动添加注释 快捷键:alt shift jwindows-->preference Java-->Code Style-->Code Templates code-->new ...