bzoj1208splay模板题
想试下新找的板子,没想到交上去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模板题的更多相关文章
- [AHOI 2009] 维护序列(线段树模板题)
1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...
- HDU 2222 AC自动机模板题
题目: http://acm.hdu.edu.cn/showproblem.php?pid=2222 AC自动机模板题 我现在对AC自动机的理解还一般,就贴一下我参考学习的两篇博客的链接: http: ...
- POJ2774 & 后缀数组模板题
题意: 求两个字符串的LCP SOL: 模板题.连一起搞一搞就好了...主要是记录一下做(sha)题(bi)过程心(cao)得(dan)体(xin)会(qing) 后缀数组概念...还算是简单的,过程 ...
- HDU 1251 Trie树模板题
1.HDU 1251 统计难题 Trie树模板题,或者map 2.总结:用C++过了,G++就爆内存.. 题意:查找给定前缀的单词数量. #include<iostream> #incl ...
- HDU-3549 最大流模板题
1.HDU-3549 Flow Problem 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=3549 3.总结:模板题,参考了 http://ww ...
- HDU 4280:Island Transport(ISAP模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=4280 题意:在最西边的点走到最东边的点最大容量. 思路:ISAP模板题,Dinic过不了. #include & ...
- HDU-2222 Keywords Search(AC自动机--模板题)
题目大意:统计一共出现了多少次模板串. 题目分析:AC自动机的模板题.不过这题有坑,相同的模板串不能只算一次. 代码如下: # include<iostream> # include< ...
- Dancing Link --- 模板题 HUST 1017 - Exact cover
1017 - Exact cover Problem's Link: http://acm.hust.edu.cn/problem/show/1017 Mean: 给定一个由0-1组成的矩阵,是否 ...
- AC自动机 - 多模式串匹配问题的基本运用 + 模板题 --- HDU 2222
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
随机推荐
- 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 ...
- canvas实现时钟
最近在看新浪体育网球频道(http://sports.sina.com.cn/tennis/)的时候,看到了下面的劳力士广告的时钟是用canvas做的,于是也实现了一个简单的canvas时钟.直接上代 ...
- java实现获取当前年月日 小时 分钟 秒 毫秒
java代码实现如下 view source print? /** * 英文简写(默认)如:2010-12-01 */ public static String F ...
- Codeforces 264 B. Good Sequences
B. Good Sequences time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- 按某个属性排序(字典序,ascII) js/python
javascrapy方法 var compare = (prop)=>{ return (a,b)=>{ : - } } javascrapy测试代码 var aaa = [ {name: ...
- .NET Framework 系统版本支持表
.tg {border-collapse:collapse;border-spacing:0;border-color:#aabcfe;} .tg td{font-family:Arial, sans ...
- WF控制台工作流(1)
简单使用WF工作流示例: using System; using System.Linq; using System.Activities; using System.Activities.State ...
- 计算机网络之互联网|因特网|万维网|HTTP|HTML之间的关系辨析
本博文基于知乎"Web 是什么意思?"一问而引起.(本文均属于博主从知乎上自身所答搬运而至). 如无特殊声明,括号()内以分号分隔的名词均等效. 本文如无特殊引用声明,则所有内容版 ...
- JavaScript之函数式编程思想初探
//result = 3*x + 5; var Mul3 = function(x){ return 3*x; } var Add5 = function(x){ return x + 5; } va ...
- 第15月第6天 ios UIScrollView不能响应TouchesBegin
1. 1:@property MyScrollView *scrollView; 2:给MyScrollView,增加类别:MyScrollView+Touch 3:在类别里实现下面三个方法: @im ...