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 ...
随机推荐
- 多线程Java Socket编程
采用Java 5的ExecutorService来进行线程池的方式实现多线程,模拟客户端多用户向同一服务器端发送请求. 1.服务端 package localSocket; import java.i ...
- Python基础【day01】:python介绍发展史(一)
本节内容 Python介绍 发展史 Python 2 or 3? 一. Python介绍 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏 ...
- JAVA 远程通讯机制
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB. Burlap.Hessian.SOAP.EJB和JMS等,这 ...
- 怎么简单高效破解MyEclipse10、获取注册码
亲测有效 附上地址:https://www.cnblogs.com/caohuimingfa/p/6659902.html
- GET_WHEEL_DELTA_WPARAM宏在C#
1.高位字,署名: ((short)(wParam>>16)) 2. 为了获得最大的清晰,我会定义一组这样的函数: internal static class NativeMethods ...
- 液晶数字显示屏QLCDNumbe
import sys from PyQt5.QtWidgets import QApplication, QWidget, QLCDNumber, QVBoxLayout class Demo(QWi ...
- Gitlab8.5安装后邮件发送不成功的解决过程
Gitlab安装成功有,注册邮件一直接收不到也是很生气,修改了 /etc/gitlab/gitlab.rb文件 gitlab_rails['smtp_enable'] = truegitlab_rai ...
- 出现fonts/fontawesome-webfont.woff?v=4.5.0 net::ERR_ABORTED
虽然网页正常显示和运行,但是有2个字体文件出现404错误. 原因:服务器没有配置MIME类型而已. 1. 在IIS网站中,找打网站对应的MIME类型,双击. 2.能看到此网站对应的MIME类型,点击右 ...
- Flask最强攻略 - 跟DragonFire学Flask - 第五篇 做一个用户登录之后查看学员信息的小例子
需求: 1. 用户名: oldboy 密码: oldboy123 2. 用户登录成功之后跳转到列表页面 3. 失败有消息提示,重新登录 4.点击学生名称之后,可以看到学生的详细信息 后端: from ...
- Vue.js用脚手架创建项目
安装全局脚手架 cnpm install vue-cli -g vue --version 用脚手架创建项目 创建项目 运行项目 停止项目:Ctrl+C 修改端口 config - index.js ...