4553: [Tjoi2016&Heoi2016]序列

Time Limit: 20 Sec  Memory Limit: 128 MB

Description

佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他。玩具上有一个数列,数列中某些项的值

可能会变化,但同一个时刻最多只有一个值发生变化。现在佳媛姐姐已经研究出了所有变化的可能性,她想请教你
,能否选出一个子序列,使得在任意一种变化中,这个子序列都是不降的?请你告诉她这个子序列的最长长度即可
。注意:每种变化最多只有一个值发生变化。在样例输入1中,所有的变化是:
1 2 3
2 2 3
1 3 3
1 1 31 2 4
选择子序列为原序列,即在任意一种变化中均为不降子序列在样例输入2中,所有的变化是:3 3 33 2 3选择子序列
为第一个元素和第三个元素,或者第二个元素和第三个元素,均可满足要求

Input

输入的第一行有两个正整数n, m,分别表示序列的长度和变化的个数。接下来一行有n个数,表示这个数列原始的

状态。接下来m行,每行有2个数x, y,表示数列的第x项可以变化成y这个值。1 <= x <= n。所有数字均为正整数
,且小于等于100,000

Output

输出一个整数,表示对应的答案

Sample Input

3 4
1 2 3
1 2
2 3
2 1
3 4

Sample Output

3
 
题解:
我们来分析一下这道题让我们干什么:
我们知道了一个序列,其中每一个元素都可能变化,
我们设他的原始值为a[i],最大值为maxv[i],最小值为minv[i],
再设f[i]为以i为结尾的最长符合要求子序列,显然这可以用一个dp来解决:对于f[i],有
  f[i]=max{f[j]}+1
而对j的要求,由于同时只有一个元素发生变化,我们就要求满足
  j<i&&maxv[j]<=a[i]&&a[j]<=minv[i]
我们发现,这好像长得“很像”一个三维偏序问题。
如果我们用树套树来解决的话,也不是不可以(详见勇士的战斗记录:BZOJ4553: [Tjoi2016&Heoi2016]序列 树套树优化DP
但是为什么我们不用更简单的做法来解决呢?
显然,这个东西是可以用cdq分治来解决的
我们对于区间[l,r],如果这个元素i在mi前面,我们就用(maxv[i],a[i])作为他的权值;否则,就用(a[i],minv[i])来作为他的权值。
这样,就可以实现上面的想法了:用前面来更新后面。这也是本题的关键。
想到了这一点,代码实现就很简单了。代码见下:
 #include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=;
int n,m,bit[N+],f[N+];
struct num{int val,maxv,minv;}x[N+];
struct cdq{int x,y,id;}a[N+];
inline int lowbit(int a){return a&(-a);}
inline bool mt(const cdq &a,const cdq &b)
{return (a.x==b.x)?a.id<b.id:a.x<b.x;}
inline void add(int i,int val)
{
while(i<=N)
{
bit[i]=(val==)?:max(bit[i],val);
i+=lowbit(i);
}
}
inline int sum(int i)
{
int ret=;
while(i)
ret=max(ret,bit[i]),i-=lowbit(i);
return ret;
}
void cdq(int l,int r)
{
if(l==r){f[l]=max(f[l],);return;}
int mi=(l+r)>>;
cdq(l,mi);
for(int i=l;i<=r;i++)
{
if(i<=mi)a[i].x=x[i].val,a[i].y=x[i].maxv;
else a[i].x=x[i].minv,a[i].y=x[i].val;
a[i].id=i;
}
sort(a+l,a+r+,mt);
for(int i=l;i<=r;i++)
{
if(a[i].id<=mi)add(a[i].y,f[a[i].id]);
else f[a[i].id]=max(sum(a[i].y)+,f[a[i].id]);
}
for(int i=l;i<=r;i++)add(a[i].y,);
cdq(mi+,r);
}
int main()
{
scanf("%d%d",&n,&m);int u,v,ans=;
for(int i=;i<=n;i++)
scanf("%d",&x[i].val),x[i].minv=x[i].maxv=x[i].val;
while(m--)
{
scanf("%d%d",&u,&v);
x[u].maxv=max(x[u].maxv,v);
x[u].minv=min(x[u].minv,v);
}
cdq(,n);
for(int i=;i<=n;i++)ans=max(ans,f[i]);
printf("%d\n",ans);
}

[BZOJ4553][HEOI2016]序列 CDQ分治的更多相关文章

  1. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  2. [BZOJ4553][TJOI2016&&HEOI2016]序列(CDQ分治)

    4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 1202  Solved: 554[Su ...

  3. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  4. 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP

    洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...

  5. [BZOJ4553][Tjoi2016&Heoi2016]序列 cdp分治+dp

    4553: [Tjoi2016&Heoi2016]序列 Time Limit: 20 Sec  Memory Limit: 128 MBSubmit: 260  Solved: 133[Sub ...

  6. 【洛谷P4093】 [HEOI2016/TJOI2016]序列 CDQ分治+动态规划

    你发现只会改变一个位置,所以可以直接进行dp 具体转移的话用 CDQ 分治转移就好了~ #include <bits/stdc++.h> #define N 100006 #define ...

  7. [HEOI2016/TJOI2016]序列 CDQ分治

    ---题面--- 题解: 首先我们观察一下,如果一个点对(j, i), 要符合题中要求要满足哪些条件? 首先我们设 j < i 那么有: j < i max[j] < v[i] v[ ...

  8. luogu4093 序列 (cdq分治优化dp)

    设f[i]是以i位置为结尾的最长满足条件子序列的长度 那么j能转移到i的条件是,$j<i , max[j]<=a[i] , a[j]<=min[i]$,其中max和min表示这个位置 ...

  9. cdq分治入门and持续学习orz

    感觉cdq分治是一个很有趣的算法 能将很多需要套数据结构的题通过离线来做 目前的一些微小的理解 在一般情况下 就像求三维偏序xyz 就可以先对x排序 然后分治 1 cdq_x(L,M) ; 2 提取出 ...

随机推荐

  1. apache开启伪静态的方法 php篇

    打开apache的配置文件httpd.conf 找到 #LoadModule rewrite_module modules/mod_rewrite.so 把前面#去掉.没有则添加,但必选独占一行,使a ...

  2. scikit-learn API

    scikit-learn API 这是scikit-learn的类和函数参考.有关详细信息,请参阅完整的用户指南,因为类和功能原始规格可能不足以提供有关其用途的完整指南. sklearn.base:基 ...

  3. Maven学习(九)-----定制库到Maven本地资源库

    这里有2个案例,需要手动发出Maven命令包括一个 jar 到 Maven 的本地资源库. 要使用的 jar 不存在于 Maven 的中心储存库中. 您创建了一个自定义的 jar ,而另一个 Mave ...

  4. 机器学习与R语言——基本语法

    一.注释 1.选中要注释的内容,快捷键Ctrl+Shift+C(取消注释方法相同) 2.在需注释内容前输入# #需注释的内容 3.利用if语句,将判断条件设置为false则可跳过if语句中的内容,相当 ...

  5. Egret入门(二)--windows下环境搭建

    准备材料 安装Node.js TypeScript编辑器 HTTP服务器(可选) Chorme(可选) Egret 安装Node.js 打开www.nodejs.org 下载安装(全部next,全默认 ...

  6. 换Mac了,迈入了终端的大门

    多终端其实本质和多线程一样,所有终端其实都共享着同一个内存只不过不同终端对共享内存不同部分的权限不同罢了所以对终端的数量必须要有限制 我这里开启了四个线程,很明显四个线程都在跑同一个内存而且四个线程都 ...

  7. 构建树形结构数据(全部构建,查找构建)C#版

    摘要: 最近在做任务管理,任务可以无限派生子任务且没有数量限制,前端采用Easyui的Treegrid树形展示控件. 一.遇到的问题 获取全部任务拼接树形速度过慢(数据量大约在900条左右)且查询速度 ...

  8. DX孟虎点评新兴市场:巴西俄罗斯火爆背后

    [亿邦动力网讯]4月3日消息,在第九届中国中小企业电子商务大会暨2014中国(河南)跨境贸易电子商务峰会上,DX公司CEO孟虎对新兴市场做了详细的分析,指出在当今的跨境电商环境下,北美.西欧作为电商成 ...

  9. SpringMVC Controller介绍及常用注解——@Controller

    一 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model ...

  10. centos上搭建git服务--4

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...