Description

给出 \(n\) 个数 \(a_i\),每一个数有一个取值 \([l_i,r_i]\) ,你来确定每一个数,使得 \(LIS\) 最大

题面

Solution

按照平时做法,设 \(f[i]\) 表示 \(LIS\) 长为 \(i\) 时, \(LIS\) 结尾的最小值

考虑插入一个取值为 \([L,R]\) 可以更新的值

找到小于 \(L\) 的第一个数 \(p\) 和小于 \(R\) 的第一个数 \(q\)

那么 \(f[p+1]\) 可以更新为 \(L\) , \(i=[p+2,q]\) 都可以被更新为 \(f[i]=f[i-1]+1\)

实际上就是把数组右移,然后再区间加 \(1\)

平衡树维护一下,对应删除 \(q+1\) ,插入 \(f[p+1]=L\)

#include<bits/stdc++.h>
using namespace std;
template<class T>void gi(T &x){
int f;char c;
for(f=1,c=getchar();c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
for(x=0;c<='9'&&c>='0';c=getchar())x=x*10+(c&15);x*=f;
}
const int N=3e5+10;
int n=0,ch[N][2],fa[N],rt=0,v[N],Q,la[N];
inline void mark(int x,int k){if(x)v[x]+=k,la[x]+=k;}
inline void pushdown(int x){
if(!la[x])return ;
mark(ch[x][0],la[x]);mark(ch[x][1],la[x]);la[x]=0;
}
inline void rotate(int x){
int y=fa[x];bool t=ch[y][1]==x;
ch[y][t]=ch[x][!t];
fa[ch[y][t]]=y;
ch[x][!t]=y;
fa[x]=fa[y];
if(fa[y])ch[fa[y]][ch[fa[y]][1]==y]=x;
fa[y]=x;
}
inline void Push(int x){
if(fa[x])Push(fa[x]);
pushdown(x);
}
inline void splay(int x,int goal){
Push(x);
while(fa[x]!=goal){
int y=fa[x],p=fa[y];
if(p==goal)rotate(x);
else if((ch[p][0]==y)==(ch[y][0]==x))rotate(y),rotate(x);
else rotate(x),rotate(x);
}
if(!goal)rt=x;
}
int ans=0;
inline int lower(int k){
int x=rt,ret=0;
while(x){
pushdown(x);
if(v[x]<k)ret=x,x=ch[x][1];
else x=ch[x][0];
}
return ret;
}
inline int nxt(int x){
splay(x,0);x=ch[x][1];
while(ch[x][0])x=ch[x][0];
return x;
}
inline void ins(int &x,int k,int last){
if(!x){v[x=++n]=k;fa[x]=last;splay(x,0);return ;}
pushdown(x);
ins(ch[x][k>v[x]],k,x);
}
inline void del(int x){
splay(x,0);
int p=ch[x][0],q=ch[x][1];
while(ch[p][1])p=ch[p][1];
while(ch[q][0])q=ch[q][0];
splay(p,0);splay(q,p);
ch[q][0]=fa[x]=0;
}
inline void solve(int l,int r){
int p=lower(l),q=lower(r),x=nxt(q);
if(p!=q){
splay(p,0);splay(x,p);
mark(ch[x][0],1);
}
if(x!=1)del(x),ans--;
ins(rt,l,0);ans++;
}
int main(){
freopen("pp.in","r",stdin);
freopen("pp.out","w",stdout);
cin>>Q;
v[++n]=1<<30;v[++n]=-(1<<30);fa[2]=1;ch[1][0]=2;rt=1;
for(int i=1,L,R;i<=Q;i++)gi(L),gi(R),solve(L,R);
cout<<ans<<endl;
return 0;
}

Codeforces 809D. Hitchhiking in the Baltic States的更多相关文章

  1. CodeForces 809D Hitchhiking in the Baltic States(FHQ-Treap)

    题意 给你长度为$n$的序列,序列中的每个元素$i$有一个区间限制$[l_i,r_i]$,你从中选出一个子序列,并给它们标号$x_i$,要求满足 $,∀i<j,x_i<x_j$,且$, ∀ ...

  2. CF 809D Hitchhiking in the Baltic States——splay+dp

    题目:http://codeforces.com/contest/809/problem/D 如果值是固定的,新加入一个值,可以让第一个值大于它的那个长度的值等于它. 如今值是一段区间,就对区间内的d ...

  3. 【CF809D】Hitchhiking in the Baltic States(Splay,动态规划)

    [CF809D]Hitchhiking in the Baltic States(Splay,动态规划) 题面 CF 洛谷 题解 朴素\(dp\):设\(f[i][j]\)表示当前考虑到第\(i\)个 ...

  4. 【CF809D】Hitchhiking in the Baltic States Splay

    [CF809D]Hitchhiking in the Baltic States 题意:给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足$t_1< ...

  5. CF809D Hitchhiking in the Baltic States

    CF809D Hitchhiking in the Baltic States CF809D 长度为n的序列{xi},n<=3e5,范围在(li,ri)之间,求LIS最长是多长g(i,l)表示前 ...

  6. CF 809 D Hitchhiking in the Baltic States —— 思路+DP(LIS)+splay优化

    题目:http://codeforces.com/contest/809/problem/D 看题解,抄标程...发现自己连 splay 都快不会写了... 首先,题目就是要得到一个 LIS: 但与一 ...

  7. 【CF809D】Hitchhiking in the Baltic States

    题意: 给你n个区间[li,ri],让你选出从中一个子序列,然后在子序列的每个区间里都选择一个tj,满足t1<t2<...<tlent1<t2<...<tlen.最 ...

  8. CF809D Hitchhiking in the Baltic States LIS、平衡树

    传送门 看到最长上升子序列肯定是DP 设\(f_i\)表示计算到当前,长度为\(i\)的最长上升子序列的最后一项的最小值,显然\(f_i\)是一个单调递增的序列. 转移:对于当前计算的元素\(x\), ...

  9. E. Three States - Codeforces Round #327 (Div. 2) 590C States(广搜)

    题目大意:有一个M*N的矩阵,在这个矩阵里面有三个王国,编号分别是123,想知道这三个王国连接起来最少需要再修多少路. 分析:首先求出来每个王国到所有能够到达点至少需要修建多少路,然后枚举所有点求出来 ...

随机推荐

  1. Ubuntu sudo apt-get update提示 Failed to fetch,解决办法

    问题: 执行sudo apt-get update提示:Failed to fetch chen@ubuntu:~/soft/Python-$ sudo apt-get update Get: htt ...

  2. jmeter接口测试注意点

    1:许多接口访问前会鉴权,不能直接访问.需要给线程组加上cookies管理. 2:第二个接口的入参是第一个接口的返回,需要先调第一个接口,在第一个接口后加后置处理器,如正则表达式提取器,提取参数供后面 ...

  3. NOS服务监控实践

    本文来自网易云社区 作者:王健 一.  背景 此处所说的服务监控程序,是通过模拟用户的请求,对一个系统的服务质量进行监控的程序.服务监控程序的主要目的是,从用户的角度出发,通过发送端到端的请求,确认系 ...

  4. 当在安卓低版本呈现的界面(H5)出现问题的时候,我们怎么解决?

    昨天,在医院现场的客服人员,向我们反馈一个问题:说一位用户用他的安卓手机打开我们的app之后,界面是乱掉的:如下图: 向客服询问了具体的设备信息:安卓系统版本号是4.2 下意识觉得是因为css的兼容问 ...

  5. 201621123012 《Java程序设计》第14次学习总结

    作业14-数据库 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截 ...

  6. “全栈2019”Java第四十三章:封装

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  7. js调试中打印语句

    document.write(); console.log(); window.alert();

  8. [ActionScript 3.0] PrintJob打印功能

    package { import flash.display.Bitmap; import flash.display.Sprite; import flash.events.MouseEvent; ...

  9. KVM 安装 VMware 虚拟机

    去掉了“双引号”改为:vmx.allowNested = TRUE 打开在其中创建虚拟机的文件夹VMDISK和搜索与您的虚拟机的名称. vmx 文件. 用记事本打开它,并添加上述条目. 所以 vmx. ...

  10. 【转】C++ 类访问控制public/private/protected探讨

    示例1:---------------------------------------- class C{ int c1; int c2;public: void set(C* s, int i, i ...