bzoj1208Splay
Splay查前驱后继
小tips:在bzoj上while(scanf)这种东西可以让程序多组数据一起跑 反正没加我就t了
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=;
const int inf=1e9;
const int mod=;
inline int read()
{
int x=,f=;
char ch=getchar();
while(!isdigit(ch)){if(ch=='')f=-f;ch=getchar();}
while(isdigit(ch)){x=*x+ch-'';ch=getchar();}
return x*f;
}
struct SplayTree
{
int rt,size;
int son[maxn][],f[maxn],val[maxn];
inline void Rotate(int x,int type)
{
int y=f[x];
son[y][!type]=son[x][type];
f[son[x][type]]=y;
f[x]=f[y];
if(f[x])son[f[y]][son[f[y]][]==y]=x;
son[x][type]=y;
f[y]=x;
}
inline void Splay(int x,int goal)
{
while(f[x]!=goal)
{
if(f[f[x]]==goal)
{
if(son[f[x]][]==x) Rotate(x,);
else Rotate(x,);
}
else
{
int y=f[x],z=f[y];
if(son[z][]==y)
{
if(son[y][]==x)Rotate(y,),Rotate(x,);
else Rotate(x,),Rotate(x,);
}
else
{
if(son[y][]==x)Rotate(y,),Rotate(x,);
else Rotate(x,),Rotate(x,);
}
}
}
if(goal==) rt=x;
}
inline void addnode(int fx,int &x,int a)
{
x=++size;
f[x]=fx;
val[x]=a;
son[x][]=son[x][]=;
}
inline void inittree()
{
size=;
addnode(,rt,-inf);
addnode(rt,son[rt][],inf);
}
inline void addNode(int a)
{
int x=rt;
while(son[x][val[x]<a]) x=son[x][val[x]<a];
addnode(x,son[x][val[x]<a],a);
Splay(size,);
}
inline void Delete(int a)
{
Splay(a,);
int tmp=son[rt][];
while(son[tmp][]) tmp=son[tmp][];
Splay(tmp,rt);
son[tmp][]=son[rt][];
f[son[rt][]]=tmp;
f[tmp]=;
rt=tmp;
}
inline int findnode(int a)
{
int x=rt;
while(x)
{
if(val[x]==a)return x;
if(val[x]>a)x=son[x][];
else x=son[x][];
}
return ;
}
inline int fx_min(int a)
{
int x=rt,minn=inf;
while(x)
{
if(val[x]==a) return a;
if(val[x]>a) minn=min(minn,val[x]);
if(val[x]>a) x=son[x][];
else x=son[x][];
}
return minn;
}
inline int fx_max(int a)
{
int x=rt,maxx=-inf;
while(x)
{
if(val[x]==a) return a;
if(val[x]<a) maxx=max(maxx,val[x]);
if(val[x]<a) x=son[x][];
else x=son[x][];
}
return maxx;
} }Splay;
int n,a,b,ans,Type[];
int main()
{
while(scanf("%d",&n)!=EOF)
{
ans=,Type[]=Type[]=;
Splay.inittree();
for(int i=;i<=n;i++)
{
a=read(),b=read();
if(Type[!a]==)
{
Type[a]++;
Splay.addNode(b);
}
else
{
int minn=Splay.fx_min(b);
int maxx=Splay.fx_max(b);
ans=(ans+min(minn-b,b-maxx))%mod;
if(b-maxx<=minn-b)Splay.Delete(Splay.findnode(maxx));
else Splay.Delete(Splay.findnode(minn));
Type[!a]--;
}
}
cout<<ans%mod<<endl;
}
}
bzoj1208Splay的更多相关文章
- bzoj1208splay模板题
想试下新找的板子,没想到交上去CE了..懒得调..以后有机会就改 /* 用type标记当前树上的是宠物还是人 每次求前驱后缀,删掉最近的那个点 */ #include<iostream> ...
随机推荐
- api签名认证
参数列表: data: { sign, uid或是openId, version, timestamp, param } sign 签名一般情况下,根据如下几项生成,通过md5或是aes加密: 接口 ...
- 九度OJ 1351:数组中只出现一次的数字 (位运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3098 解决:906 题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 输入: 每个 ...
- L2 范数 L1 范数 出租车范数
https://en.wikipedia.org/wiki/Norm_(mathematics) http://cs231n.github.io/classification/
- how to add them, how to multiply them
http://www.physics.miami.edu/~nearing/mathmethods/operators.pdf
- [note]可持久化Trie
可持久化Trie 参考可持久化线段树的思想,修改的时候先直接复制,再对需要修改的点新建节点 可持久化Trie也是同样的做法,假设现在需要在原本Trie的基础上插入一个字符串 先把上个Trie的对应节点 ...
- vue 计算属性和监听器
一.计算属性 模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div> {{ message.split('').rev ...
- 获取comboBox里面的item使用的方法
使用currentIndex()或者currentText() void Widget::calc() { int first = ui->firstLineEdit->text().to ...
- vim vimdiff diff 使用及命令
vim: vim 从 vim7 开始加入了多标签切换的功能, 相当于多窗口. 之前的版本虽然也有多文件编辑功能, 但是总之不如这个方便啦.用法::tabnew [++opt选项] [+cmd] 文件 ...
- vim下的ctags和taglist等的使用和配置
1.ctags (1)到 http://prdownloads.sourceforge.net/ctags/ctags-5.6.tar.gz 下载ctags源码ctags-5.6.ta ...
- 关于mosquitto_internal.h:40:25:#include <uuid/uuid.h> 致命错误的解决
一.安装mosquitto1.4的时候使用make的时候报以下错误: mosquitto_internal.h:40:25: 致命错误:openssl/ssl.h:没有那个文件或目录 #include ...