博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
luogu4093 序列 (cdq分治优化dp)
阅读量:5023 次
发布时间:2019-06-12

本文共 1567 字,大约阅读时间需要 5 分钟。

设f[i]是以i位置为结尾的最长满足条件子序列的长度

那么j能转移到i的条件是,$j<i , max[j]<=a[i] , a[j]<=min[i]$,其中max和min表示这个位置能变化出来的最大值或最小值

这个东西用一个cdq来做

具体来说,先做左半区间,然后左边按max排序,右边按a排序,把左边的f按a为下标加到树状数组里,右面的用min来查,最后在做右半区间

1 #include
2 #define CLR(a,x) memset(a,x,sizeof(a)) 3 using namespace std; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 typedef pair
pa; 7 const int maxn=1e5+10; 8 9 inline ll rd(){10 ll x=0;char c=getchar();int neg=1;11 while(c<'0'||c>'9'){
if(c=='-') neg=-1;c=getchar();}12 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();13 return x*neg;14 }15 16 int N,M,V=1e5,a[maxn],ma[maxn],mi[maxn],f[maxn],ord[maxn];17 18 inline bool cmp1(int x,int y){
return a[x]
=r) return;32 int m=l+r>>1;33 cdq(l,m);34 for(int i=l;i<=r;i++) ord[i]=i;35 sort(ord+l,ord+m+1,cmp1),sort(ord+m+1,ord+r+1,cmp2);36 int p=l,q=m+1;37 for(;q<=r;q++){38 for(;p<=m&&a[ord[p]]<=mi[ord[q]];p++) change(ma[ord[p]],f[ord[p]]);39 f[ord[q]]=max(f[ord[q]],query(a[ord[q]])+1);40 }41 for(p=l;p<=m;p++) change(ma[ord[p]],0);42 cdq(m+1,r);43 }44 45 int main(){46 //freopen("","r",stdin);47 int i,j,k;48 N=rd(),M=rd();49 for(i=1;i<=N;i++)50 a[i]=ma[i]=mi[i]=rd(),f[i]=1;51 for(i=1;i<=M;i++){52 int x=rd(),y=rd();53 ma[x]=max(ma[x],y),mi[x]=min(mi[x],y);54 }55 cdq(1,N);56 int ans=0;57 for(i=1;i<=N;i++) ans=max(ans,f[i]);58 printf("%d\n",ans);59 return 0;60 }

 

转载于:https://www.cnblogs.com/Ressed/p/9997125.html

你可能感兴趣的文章
CodeBlocks X64 SVN 编译版
查看>>
Excel催化剂开源第42波-与金融大数据TuShare对接实现零门槛零代码获取数据
查看>>
bug记录_signalr执行$.connnection.testhub结果为空
查看>>
【转】常用的latex宏包
查看>>
[TMS320C674x] 一、GPIO认识
查看>>
酷狗的皮肤文件存放在哪
查看>>
iOS RunLoop简介
查看>>
C++的引用
查看>>
T-SQL查询进阶--深入浅出视图
查看>>
MapKeyboard 键盘按键映射 机械革命S1 Pro-02
查看>>
Android读取url图片保存及文件读取
查看>>
完整ASP.Net Excel导入
查看>>
判断CPU大小端示例代码
查看>>
ARTS打卡第13周
查看>>
循环队列的运用---求K阶斐波那契序列
查看>>
pta 编程题14 Huffman Codes
查看>>
初始化bootstrap treeview树节点
查看>>
python selenium向<sapn>标签中写入内容
查看>>
JS常用坐标
查看>>
使用”结构化的思考方式“来编码和使用”流程化的思考方式“来编码,孰优孰劣?...
查看>>