CF809D-Hitchhiking in the Baltic States【FhqTreap】

1|0正题

题目链接:https://www.luogu.com.cn/problem/CF809D


2|0正题

题目链接:https://www.luogu.com.cn/problem/CF809D


2|1题目大意

有一个长度为n的序列a,要求ai[li,ri],要求使得a的最长严格上升子序列最长。

1n3×105,1liri109


2|2解题思路

考虑一下暴力的做法,我们设fi表示在目前的序列中后面加个数字i为结尾时的最长上升子序列,那么显然f是单调不降的。

同理由于是严格上升,所以我们f不可能一次升2的值,也就是fifi1+1。所以我们可以考虑维护fi=fi1+1的位置,也就是维护f的差分数组中的1的位置。

考虑新加入一个[l,r]时的变化,那对于所有i[l+1,r+1]都有fi=max{fi,fj+1}(j<i),注意到1位置的变化我们可以得出一下结论,当修改[l,r]时需要

  1. [l+1,r]中所有1的后面那个1移动到这个1的后一位。
  2. [l+1,r]中的第一个1移动到l+1

这个操作看起来很难实现,实际上我们可以将第一个视为将[l+1,r+1]中的1往后移一格。

我们用FhqTreap维护1的位置,然后把(r,)中第一个1删除,[l+1,r]中的所有1往后移一格,再在l+1这个位置插一个1就好了。

时间复杂度:O(nlogn)


2|3code

#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=3e5+10; int n,cnt,rt,w[N],dat[N],lazy[N],siz[N],t[N][2]; void Downdata(int x){ if(!lazy[x])return; for(int i=0;i<2;i++){ if(!t[x][i])continue; lazy[t[x][i]]+=lazy[x]; w[t[x][i]]+=lazy[x]; } lazy[x]=0;return; } int NewNode(int val){ siz[++cnt]=1;dat[cnt]=rand(); w[cnt]=val;return cnt; } void PushUp(int x){ siz[x]=siz[t[x][0]]+siz[t[x][1]]+1; return; } void Split(int &x,int &y,int p,int k){ if(!p){x=y=0;return;}Downdata(p); if(w[p]<=k)x=p,Split(t[x][1],y,t[p][1],k); else y=p,Split(x,t[y][0],t[p][0],k); PushUp(p);return; } int Merge(int x,int y){ Downdata(x);Downdata(y); if(!x||!y)return x|y; if(dat[x]<dat[y]){ t[x][1]=Merge(t[x][1],y); PushUp(x);return x; } else{ t[y][0]=Merge(x,t[y][0]); PushUp(y);return y; } return x|y; } int Findk(int x,int k){ if(siz[t[x][0]]>=k)return Findk(t[x][0],k); if(siz[t[x][0]]+1==k)return x; return Findk(t[x][1],k-siz[t[x][0]]-1); } int main() { // freopen("vague.in","r",stdin); // freopen("vague.out","w",stdout); srand(19260817); scanf("%d",&n); for(int i=1,l,r;i<=n;i++){ scanf("%d%d",&l,&r); int x,y,z;l++; Split(x,y,rt,l-1); Split(y,z,y,r); if(z){ int v=w[Findk(z,1)],nu; Split(nu,z,z,v); } if(y)lazy[y]++,w[y]++; y=Merge(NewNode(l),y); y=Merge(y,z); rt=Merge(x,y); } printf("%d\n",siz[rt]); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/15865747.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示