[HEOI2016] 序列
Description
有n个数,每个数有若干取值,但是只能在原数列的一个位置变换取值,求一个最长上升子序列,满足无论数列如何变化,这都是一个最长上升子序列。
Solution
记录 \(l[i],r[i]\) 分别表示 \(i\) 能取到的最大最小值,\(val[i]\) 为原数列。
我们来看看满足条件的二元组 \(i,j\) 满足什么条件。
- \(i<j\)
- \(val[i]<val[j]\)
- \(r[i]<val[j]\)
- \(val[i]<l[j]\)
观察到条件2包含在条件3,4里。
二维偏序问题,上CDQ就行。
Code
#include<cstdio>
#include<cctype>
#include<cstring>
#include<algorithm>
#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<y.l;
}
bool cmp2(Node x,Node y){
return x.idx<y.idx;
}
bool cmp3(Node x,Node y){
return x.val<y.val;
}
void add(int x,int y){
for(;x<=len;x+=x&-x)
f[x]=max(f[x],y);
}
int query(int x){
int now=0;
for(;x;x-=x&-x)
now=max(now,f[x]);
return now;
}
int getint(){
int x=0,f=0;char ch=getchar();
while(!isdigit(ch)) f|=ch=='-',ch=getchar();
while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
void cdq(int l,int r){
if(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;
}
[HEOI2016] 序列的更多相关文章
- BZOJ 4553 Tjoi2016&Heoi2016 序列
Tjoi2016&Heoi2016序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最 ...
- 4553: [Tjoi2016&Heoi2016]序列
4553: [Tjoi2016&Heoi2016]序列 链接 分析: 注意所有m此操作中,只会发生一个,于是考虑dp.dp[i]=dp[j]+1,j<i,a[j]<=L[i],R[ ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- [BZOJ4553][HEOI2016]序列 CDQ分治
4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MB Description 佳媛姐姐过生日的时候,她的小伙 ...
- [BZOJ4553][TJOI2016&&HEOI2016]序列(CDQ分治)
4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1202 Solved: 554[Su ...
- [BZOJ4553][Tjoi2016&Heoi2016]序列 cdp分治+dp
4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 260 Solved: 133[Sub ...
- bzoj4553 [Tjoi2016&Heoi2016]序列 树状数组(区间最大值)+cqd
[Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1006 Solved: 464[Submit][ ...
- BZOJ4553: [Tjoi2016&Heoi2016]序列
Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值 可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所 ...
- BZOJ4553: [Tjoi2016&Heoi2016]序列 树套树优化DP
把pos[i]上出现的平常值定义为nor[i]最大值定义为max[i]最小值定义为min[i],那么我们发现在两个值,i(前),j(后),当且仅当max[i]<=nor[j],nor[i]< ...
- 【50.40%】【BZOJ 4553】[Tjoi2016&Heoi2016]序列
Time Limit: 20 Sec Memory Limit: 128 MB Submit: 371 Solved: 187 [Submit][Status][Discuss] Descript ...
随机推荐
- win10自带输入法的标点符号切换
快捷键是ctrl+句号 然后开启设置,把中文也用英文标点也选上.
- qsort例子
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> typ ...
- 在cmd下可以import cv2,而Pycharm报错:找不到cv2
平台:win10 x64+Pycharm+Anaconda3+opencv 安装教程:参考博客——http://blog.sina.com.cn/s/blog_cca23c300102xiy4.htm ...
- To handling editor letter
一般崔稿信写法: Dear Editor: Sorry for disturbing you. We’re not sure if it is the right time to contact yo ...
- RS232、RS485和RS422
一.232电平.TTL电平和CMOS电平 1.232电平:逻辑1:-3V--15V: 逻辑0:+3-+15V. 2.TTL电平:逻辑1:5V: 逻辑0:0V.具体是,输出高电平:VOH≥ ...
- 有关PHPhash算法
https://www.cnblogs.com/shangzekai/p/4444169.html
- 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Application Data 中的媒体
[源码下载] 背水一战 Windows 10 (91) - 文件系统: Application Data 中的文件操作, Application Data 中的“设置”操作, 通过 uri 引用 Ap ...
- oracle中order by造成分页错误
问题:今天在工作中,在service中调用分页查询列表接口的时候,返回的到页面的数据中总是存在缺失的数据,还有重复的数据. 分析:select * from (select ROWNUM rn,t.* ...
- go语言异常处理
go语言异常处理 error接口 go语言引入了一个关于错误错里的标准模式,即error接口,该接口的定义如下: type error interface{ Error() string } 对于要返 ...
- zookeeper常用指令
zk服务 bin 目录下常用的脚本解释 zkCleanup 清理 Zookeeper 历史数据,包括日志文件和快照数据文件 zkCli Zookeeper 的一个简易客户端 zkEnv 设置 Zook ...