【CF809D】Hitchhiking in the Baltic States Splay
【CF809D】Hitchhiking in the Baltic States
题意:给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足$t_1<t_2<...<t_{len}$。最大化这个子序列的长度。
$1\le n\le 3\cdot 10^5,1\le l\le r \le 10^9$
题解:我们用dp[i]表示在当前情况下,选择的最后一个$t\le i$时,最多能选多少个区间。然后我们加入每个区间,同时维护所有的dp值。
当加入区间[l,r]时,首先$dp[i]=max(dp[i],dp[i-1]+1),1\le l \le r$,又因为$dp[i]\le dp[i-1]+1$,所以必然会更新,我们用平衡树直接将区间平移一段,再区间+1即可。然后$dp[i]=max(dp[i],dp[r]+1),i>r$,我们可以在平衡树上找到最后一个dp[i]=dp[r]的位置,然后进行区间+1。
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=300010;
int n,tot,pre,nxt,ans,rt;
struct node
{
int ch[2],fa,tag,sv,siz;
}s[maxn<<2];
inline void pushup(int x)
{
s[x].siz=s[s[x].ch[0]].siz+s[s[x].ch[1]].siz+1;
}
inline void upd(int x,int v)
{
if(x) s[x].tag+=v,s[x].sv+=v;
}
inline void pushdown(int x)
{
if(s[x].tag) upd(s[x].ch[0],s[x].tag),upd(s[x].ch[1],s[x].tag),s[x].tag=0;
}
inline void rotate(int x,int &k)
{
int y=s[x].fa,z=s[y].fa,d=(x==s[y].ch[1]);
if(y==k) k=x;
else s[z].ch[y==s[z].ch[1]]=x;
s[x].fa=z,s[y].fa=x,s[y].ch[d]=s[x].ch[d^1];
if(s[x].ch[d^1]) s[s[x].ch[d^1]].fa=y;
s[x].ch[d^1]=y;
pushup(y),pushup(x);
}
inline void splay(int x,int &k)
{
while(x!=k)
{
int y=s[x].fa,z=s[y].fa;
if(y!=k)
{
if((x==s[y].ch[0])^(y==s[z].ch[0])) rotate(x,k);
else rotate(y,k);
}
rotate(x,k);
}
}
int find(int x,int y)
{
pushdown(x);
if(y<=s[s[x].ch[0]].siz) return find(s[x].ch[0],y);
else if(y>s[s[x].ch[0]].siz+1) return find(s[x].ch[1],y-s[s[x].ch[0]].siz-1);
return x;
}
void getpre(int x,int y)
{
if(!x) return ;
pushdown(x);
if(s[x].sv<y) pre=x,getpre(s[x].ch[1],y);
else getpre(s[x].ch[0],y);
}
int build(int l,int r)
{
if(l>r) return 0;
int x=(l+r)>>1;
s[x].siz=r-l+1,s[x].ch[0]=build(l,x-1),s[x].ch[1]=build(x+1,r),s[x].sv=1<<30;
if(s[x].ch[0]) s[s[x].ch[0]].fa=x;
if(s[x].ch[1]) s[s[x].ch[1]].fa=x;
pushup(x);
return x;
}
void dfs(int x,int y)
{
if(!x) return ;
pushdown(x);
if(s[x].sv<(1<<30))
{
ans=max(ans,y+s[s[x].ch[0]].siz);
dfs(s[x].ch[1],y+s[s[x].ch[0]].siz+1);
}
else dfs(s[x].ch[0],y);
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-') f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+(gc^'0'),gc=getchar();
return ret*f;
}
int main()
{
n=rd();
rt=build(1,n+3);
s[0].sv=s[1].sv=0;
int i,a,b,x,y,z,rx,ry,p,q;
for(i=1;i<=n;i++)
{
a=rd(),b=rd();
getpre(rt,a),x=pre,getpre(rt,b),y=pre;
splay(y,rt),ry=s[s[y].ch[0]].siz+1;
q=find(y,ry+2),splay(q,s[y].ch[1]);
z=s[q].ch[0],s[q].ch[0]=0,pushup(q),pushup(y);
s[z].sv=a;
splay(x,rt),rx=s[s[x].ch[0]].siz+1;
p=find(x,rx+1),splay(p,s[x].ch[1]);
s[p].ch[0]=z,s[z].fa=p,pushup(p),pushup(x);
splay(z,rt),splay(q,s[z].ch[1]);
upd(s[q].ch[0],1);
}
dfs(rt,0);
printf("%d",ans);
return 0;
}//20 1 2 4 13 17 18 24 28 16 34 5 25 1 23 8 26 27 36 1 27 3 9 15 29 8 16 9 28 13 34 7 11 3 7 12 40 20 28 10 33
【CF809D】Hitchhiking in the Baltic States Splay的更多相关文章
- 【CF809D】Hitchhiking in the Baltic States(Splay,动态规划)
[CF809D]Hitchhiking in the Baltic States(Splay,动态规划) 题面 CF 洛谷 题解 朴素\(dp\):设\(f[i][j]\)表示当前考虑到第\(i\)个 ...
- 【CF809D】Hitchhiking in the Baltic States
题意: 给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足t1<t2<...<tlent1<t2<...<tlen.最 ...
- CF 809D Hitchhiking in the Baltic States——splay+dp
题目:http://codeforces.com/contest/809/problem/D 如果值是固定的,新加入一个值,可以让第一个值大于它的那个长度的值等于它. 如今值是一段区间,就对区间内的d ...
- CF809D Hitchhiking in the Baltic States
CF809D Hitchhiking in the Baltic States CF809D 长度为n的序列{xi},n<=3e5,范围在(li,ri)之间,求LIS最长是多长g(i,l)表示前 ...
- 【LeetCode】802. Find Eventual Safe States 解题报告(Python)
[LeetCode]802. Find Eventual Safe States 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemi ...
- 【BZOJ1862】[ZJOI2006]游戏排名系统 (Splay)
[BZOJ1862][ZJOI2006]游戏排名系统 (Splay) 题面 BZOJ 洛谷 题解 双倍经验题
- 【BZOJ4864】[BeiJing 2017 Wc]神秘物质 Splay
[BZOJ4864][BeiJing 2017 Wc]神秘物质 Description 21ZZ 年,冬. 小诚退休以后, 不知为何重新燃起了对物理学的兴趣. 他从研究所借了些实验仪器,整天研究各种微 ...
- 【BZOJ3506】[CQOI2014] 排序机械臂(Splay)
点此看题面 大致题意: 给你\(n\)个数.第一次找到最小值所在位置\(P_1\),翻转\([1,P_1]\),第二次找到剩余数中最小值所在位置\(P_2\),翻转\([2,P_2]\),以此类推.求 ...
- 【模板】普通平衡树(权值splay)
安利splay讲解: [洛谷日报第62期]Splay简易教程 [模板]普通平衡树(luogu) Description 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下 ...
随机推荐
- char与TCHAR相互转换(拒绝中文乱码,好用!)
C++编程中屡屡要遇到宽窄字符转换的问题,尤其是字符串中有中文,稍有不慎就会中文乱码,程序运行出错. 下面为char*.char[]与TCHAR*.TCHAR[]互转的用法,不求花哨,只求好用!请参考 ...
- mysql中已经存在某个库中有大小写的表,将lower_case_table_names由0改为1对已经存在的表是否有影响?
需求描述: 今天遇到了修改lower_case_table_names参数的问题,想了下,如果原来里面有表,表名有大小写的, 如果将lower_case_table_names从默认的0改为1之后,那 ...
- 【Mongodb】用户和认证 权限总结
开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库! 在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin ...
- SpringMVC由浅入深day02_5数据回显_6异常处理器
5 数据回显 5.1 什么数据回显 表单提交失败需要再回到表单页面重新填写,原来提交的数据需要重新在页面上显示. 5.2 pojo数据回显方法 1.springmvc默认对pojo数据进行回显. po ...
- Servlet入门总结及第一个Servlet程序
目录 一了解Servlet的概念 二Servlet技术功能 三 Servlet技术特点 四 Servlet生命周期 五servlet工作过程 六 Servlet与JSP区别 七Servlet代码结构 ...
- Dubbo -- 系统学习 笔记 -- 示例 -- 多版本
Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 多版本 当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间 ...
- NetBpm 数据库(9)
原文:http://blog.csdn.net/adicovofer/article/details/1718592 关注NetBpm也很久了,可是一直没有静下心来研究,为了生活的琐事,太过浮躁……今 ...
- 开发还是应该使用linux
这几天在Windows系统下,安装了几个IDE,体量大,4.5个G,启动速度慢,占用系统资源多,并且最难受的是,这些IDE的限制性太强,只能按照UI给定的规则来操作,例如现在手中有一个已完成的项目,用 ...
- 【Python】TF环境
1.pip show pip 2.python -m pip install --upgrade pip 3.conda list 4.pip install tensorflow 5.pip ins ...
- Oracle sqlldr导入之“MAXIMUM ERROR COUNT EXCEEDED”
昨天看到一个同事在通过PL/SQL Developer工具把文本数据往oracle表;有两个文本:一个有30万条记录:一个7万多条记录.在导入到过程中:出现错误记录还需要点击确认.不过使用黑科技(屏幕 ...