博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HEOI2016] 序列
阅读量:5084 次
发布时间:2019-06-13

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

Description

有n个数,每个数有若干取值,但是只能在原数列的一个位置变换取值,求一个最长上升子序列,满足无论数列如何变化,这都是一个最长上升子序列。

Solution

记录 \(l[i],r[i]\) 分别表示 \(i\) 能取到的最大最小值,\(val[i]\) 为原数列。

我们来看看满足条件的二元组 \(i,j\) 满足什么条件。

  1. \(i<j\)
  2. \(val[i]<val[j]\)
  3. \(r[i]<val[j]\)
  4. \(val[i]<l[j]\)

观察到条件2包含在条件3,4里。

二维偏序问题,上CDQ就行。

Code

#include
#include
#include
#include
#define N 100005#define min(A,B) ((A)<(B)?(A):(B))#define max(A,B) ((A)>(B)?(A):(B))#define swap(A,B) ((A)^=(B)^=(A)^=(B))int f[N];int ans[N];int n,m,len;int last[N];struct Node{ int val,l,r,idx;}node[N];bool cmp(Node x,Node y){ return x.l
=r) return; int mid=l+r>>1; cdq(l,mid); std::sort(node+l,node+mid+1,cmp3); std::sort(node+mid+1,node+r+1,cmp); int a=l; memset(f,0,sizeof f); for(int j=mid+1;j<=r;j++){ while(a<=mid and node[a].val<=node[j].l){ add(node[a].r,ans[node[a].idx]); a++; } int p=query(node[j].val); ans[node[j].idx]=max(ans[node[j].idx],p+1); } std::sort(node+l,node+r+1,cmp2); cdq(mid+1,r);}signed main(){ n=getint(),m=getint(); for(int i=1;i<=n;i++){ ans[i]=1; node[i].val=node[i].l=node[i].r=getint(); len=max(len,node[i].l); node[i].idx=i; } for(int i=1;i<=m;i++){ int x=getint(),y=getint(); len=max(len,y); node[x].r=max(node[x].r,y); node[x].l=min(node[x].l,y); } cdq(1,n); int maxn=0; for(int i=1;i<=n;i++) maxn=max(maxn,ans[i]); printf("%d\n",maxn); return 0;}

转载于:https://www.cnblogs.com/YoungNeal/p/9374452.html

你可能感兴趣的文章
git 代码更新
查看>>
eclipse转到idea过程中的基本设置...
查看>>
需求分析
查看>>
hadoop-maven项目打包成可执行的jar
查看>>
[欧拉回路][并查集] Bzoj P3706 反色刷
查看>>
Python学习之路:guess_rx_wan
查看>>
字符串转化为可执行的方法
查看>>
select和epoll学习总结
查看>>
pku 3661 Running DP
查看>>
BZOJ4923 K小值查询(splay)
查看>>
被sleep开了个小玩笑
查看>>
centos安装memcache与telnet
查看>>
安卓ROOT后禁用/隐藏导航栏/虚拟按键
查看>>
day13 字典生成式
查看>>
将二维数组转为一维数组的2种方法
查看>>
使用1.7 Files,实现编码探测
查看>>
(二)快速搭建 ASP.net core Web 应用
查看>>
TopCoder-SRM635-DIV1-250pt-SimilarRatingGraph-枚举+边界处理
查看>>
轻松搞懂Python的属性和方法
查看>>
JVM内存状况查看方法和分析工具
查看>>