洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告
P4093 [HEOI2016/TJOI2016]序列
题目描述
佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化。现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可 。
注意:每种变化最多只有一个值发生变化。在样例输入1中,所有的变化是:
1 2 3
2 2 3
1 3 3
1 1 3
1 2 4
输入输出格式
输入格式:
输入的第一行有两个正整数\(n\),\(m\),分别表示序列的长度和变化的个数。接下来一行有\(n\)个数,表示这个数列原始的状态。接下来\(m\)行,每行有2个数\(x\),\(y\),表示数列的第\(x\)项可以变化成\(y\)这个值。\(1 \le x \le n\)。
输出格式:
输出一个整数,表示对应的答案
说明
对于\(20\%\)数据所有数字均为正整数,且小于等于\(300\)
对于\(50\%\)数据所有数字均为正整数,且小于等于\(3,000\)
对于\(100\%\)数据所有数字均为正整数,且小于等于\(100,000\)
窝太菜了,\(dp\)想复杂了...
一开始一直想着是只能改一个还要取最坏情况,我不可能在\(dp\)状态里面存着这些奇怪的是否取了还能取到最差结果啊。
然而重点在于取最坏情况的任意性...
令\(mx_i,mi_i.now_i\)分别为位置\(i\)的可取最大,最小和当前值。
则可以转移\(dp_i=\max dp_j+1(mx_j\le now_i \&\& now_j\le mi_i)\)
后面的偏序条件可以树套树维护,这里采用CDQ分治
有一些注意点
- 先做左边,然后处理左对右的贡献,然后做右边
- 处理完贡献要把右边的顺序还原
Code:
#include <cstdio>
#include <algorithm>
const int N=1e5+10;
struct node
{
int mi,mx,now,id;
}q[N],sq[N];
bool cmp1(node n1,node n2){return n1.mx<n2.mx;}
bool cmp2(node n1,node n2){return n1.now<n2.now;}
int s[N],n,m,ans[N];
int max(int x,int y){return x>y?x:y;}
int min(int x,int y){return x<y?x:y;}
void add(int x,int d){while(x<=N)s[x]=max(s[x],d),x+=x&-x;}
void Clear(int x){while(x<=N)s[x]=0,x+=x&-x;}
int ask(int x){int mx=0;while(x)mx=max(mx,s[x]),x-=x&-x;return mx;}
void CDQ(int l,int r)
{
if(l==r) {ans[q[l].id]=max(ans[q[l].id],1);return;}
int mid=l+r>>1;
CDQ(l,mid);
for(int i=mid+1;i<=r;i++) sq[i]=q[i];
std::sort(q+l,q+mid+1,cmp1);std::sort(q+mid+1,q+r+1,cmp2);
int lp=l,rp=mid+1;
while(lp<=mid&&rp<=r)
{
if(q[lp].mx<=q[rp].now)
add(q[lp].now,ans[q[lp].id]),++lp;
else
ans[q[rp].id]=max(ans[q[rp].id],ask(q[rp].mi)+1),++rp;
}
while(rp<=r) ans[q[rp].id]=max(ans[q[rp].id],ask(q[rp].mi)+1),++rp;
for(int i=l;i<lp;i++) Clear(q[i].now);
for(int i=mid+1;i<=r;i++) q[i]=sq[i];
CDQ(mid+1,r);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&q[i].now),q[i].mx=q[i].mi=q[i].now,q[i].id=i;
for(int a,b,i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
q[a].mi=min(q[a].mi,b);
q[a].mx=max(q[a].mx,b);
}
CDQ(1,n);
int mx=0;
for(int i=1;i<=n;i++) mx=max(mx,ans[i]);
printf("%d\n",mx);
return 0;
}
2018.11.27
洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告的更多相关文章
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...
- 洛谷 P4091 [HEOI2016/TJOI2016]求和 解题报告
P4091 [HEOI2016/TJOI2016]求和 题目描述 在2016年,佳媛姐姐刚刚学习了第二类斯特林数,非常开心. 现在他想计算这样一个函数的值: \[ f(n)=\sum_{i=0}^n\ ...
- 洛谷P4093 [HEOI2016/TJOI2016]序列
题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性, ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列(Cdq+dp)
题面 luogu 题解 \(Cdq分治+dp\) \(mx[i],mn[i]\)分别表示第\(i\)位最大,最小能取到多少 那么有 \(j < i\) \(mx[j] \le a[i]\) \( ...
- 洛谷 P2659 美丽的序列 解题报告
P2659 美丽的序列 题目背景 GD是一个热衷于寻求美好事物的人,一天他拿到了一个美丽的序列. 题目描述 为了研究这个序列的美丽程度,GD定义了一个序列的"美丽度"和" ...
- 洛谷 P2501 [HAOI2006]数字序列 解题报告
P2501 [HAOI2006]数字序列 题目描述 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不希望改变的幅度太大. ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
随机推荐
- VR中射线点击按钮的实现
VR中实现UI的Button点击,主要是需要实现IPointerClickHandler接口,因为在Unity将所有的按钮操作都封装成了相应的接口,需要相应的功能只需要去实现对应的接口就好了.在这里我 ...
- [network]数字签名
数字签名(又称公钥数字签名.电子签章)是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术实现,用于鉴别数字信息的方法.一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证. ...
- 树形dp入门两题
题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...
- [redis] linux下安装篇(1)
一.redis是什么redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有 ...
- 20181120-8 Beta阶段第2周/共2周 Scrum立会报告+燃尽图 05
此作业要求参见[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2413] 版本控制地址 [https://git.coding.ne ...
- 20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结
20172326『Java程序设计』课程结对编程练习_四则运算第二周阶段总结 小组成员 20172313 余坤澎 20172332 于欣月 20172326 康皓越 小组编程照片 设计思路 通过一个E ...
- Macbook Pro开机黑屏了。
问题描述:点了appstore的更新,然后重启黑屏.(说明:黑屏是屏幕没亮:灰屏是屏幕亮了是灰黑色的.) 黑屏问题大,灰屏问题小. 开机按option没反应的跳到步骤四 一.数据 苹果电脑黑屏了,想搞 ...
- Linux系统中增加swap空间大小
在我的树莓派pi3上编译dlib库时,发现由于内存不足导致编译失败.树莓派是1G内存,swap只有50M,因此将swap增加到500M,编译通过.具体设置方法如下: 使用free命令带上m参数,查看s ...
- erlang node time ticket
Erlang doesn't detect net splits by itself. You could start looking atnet_kernel:set_net_ticktime/2 ...
- set集合,深浅拷贝以及部分知识点补充
目录: 1.基础数据类型补充 2.set集合 3.深浅拷贝 一,基础数据类型补充 字符串的基本操作 li = ["李李嘉诚", "麻花藤", "⻩黄海 ...