【[HEOI2016/TJOI2016]序列】
压行真漂亮
首先这肯定是一个\(dp\)了
设\(dp_i\)表示\(i\)结尾的最长不下降子序列的长度
显然我们要找一个\(j\)来转移
也就是\(dp_i=max(dp_j+1)\)
那么什么样的\(j\)满足条件呢
首先得是\(j<i\)
我们还注意到一个条件就是这个序列里最多也只有一个位置会发生变化
可能是\(i\)这个位置发生变化,那么显然需要满足对于任意的\(a_i\)都需要满足大于等于\(val_j\)
于是就有\(val_j<=min_i\)
自然也有可能是前面的\(j\)发生变化,显然就是\(max_j<=val_i\)
之后这就是一个三维偏序了,\(CDQ\)分治就可以啦
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define re register
#define lowbit(x) ((x)&(-x))
#define maxn 100005
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{
char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
int n,m,M;
int c[maxn];
inline void add(int x,int val) {for(re int i=x;i<=M;i+=lowbit(i)) c[i]=max(c[i],val);}
inline void clear(int x) {for(re int i=x;i<=M;i+=lowbit(i)) c[i]=0;}
inline int ask(int x) {int now=0;for(re int i=x;i;i-=lowbit(i)) now=max(c[i],now);return now;}
struct Point {int x,y,rk,ans,v;}a[maxn];
inline int cmp1(Point A,Point B) {return A.x<B.x;}
inline int cmp2(Point A,Point B) {return A.v<B.v;}
inline int cmp3(Point A,Point B) {return A.rk<B.rk;}
void CDQ(int s,int t)
{
if(s==t) return;
int mid=s+t>>1;
CDQ(s,mid),std::sort(a+s,a+mid+1,cmp2),std::sort(a+mid+1,a+t+1,cmp1);
int i=s,j=mid+1;
while(i<=mid&&j<=t)
if(a[i].v<=a[j].x) add(a[i].y,a[i].ans),i++;
else {int now=ask(a[j].v)+1;a[j].ans=max(a[j].ans,now),j++;}
while(j<=t) {int now=ask(a[j].v)+1;a[j].ans=max(a[j].ans,now),j++;}
for(re int k=s;k<i;k++) clear(a[k].y);
std::sort(a+mid+1,a+t+1,cmp3);CDQ(mid+1,t);
}
int main()
{
n=read(),m=read();
int A,B; for(re int i=1;i<=n;i++) a[i].x=a[i].y=read(),M=max(M,a[i].x),a[i].rk=i,a[i].ans=1,a[i].v=a[i].x;
for(re int i=1;i<=m;i++) A=read(),B=read(),a[A].y=max(a[A].y,B),M=max(M,a[A].y),a[A].x=min(a[A].x,B);
CDQ(1,n);int tot=0;for(re int i=1;i<=n;i++) tot=max(tot,a[i].ans);printf("%d\n",tot);
return 0;
}
【[HEOI2016/TJOI2016]序列】的更多相关文章
- cdq分治(hdu 5618 Jam's problem again[陌上花开]、CQOI 2011 动态逆序对、hdu 4742 Pinball Game、hdu 4456 Crowd、[HEOI2016/TJOI2016]序列、[NOI2007]货币兑换 )
hdu 5618 Jam's problem again #include <bits/stdc++.h> #define MAXN 100010 using namespace std; ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告
P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- 题解 P4093 【[HEOI2016/TJOI2016]序列】
这道题原来很水的? noteskey 一开始以为是顺序的 m 个修改,然后选出一段最长子序列使得每次修改后都满足不降 这 TM 根本不可做啊! 于是就去看题解了,然后看到转移要满足的条件的我发出了黑人 ...
- BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)
题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...
- 洛谷 P4093: bzoj 4553: [HEOI2016/TJOI2016]序列
题目传送门:洛谷P4093. 题意简述: 给定一个长度为 \(n\) 的序列 \(a\). 同时这个序列还可能发生变化,每一种变化 \((x_i,y_i)\) 对应着 \(a_{x_i}\) 可能变成 ...
- BZOJ4553:[HEOI2016/TJOI2016]序列——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4553 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某 ...
- Luogu P4093 [HEOI2016/TJOI2016]序列 dp套CDQ
题面 好久没写博客了..最近新学了CDQ...于是就来发一发一道CDQ的练习题 看上去就是可以dp的样子. 设\(dp_{i}\)为以i结尾的最长不下降序列. 易得:\(dp_{i}\)=\(max( ...
- 洛谷P4093 [HEOI2016/TJOI2016]序列
题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性, ...
随机推荐
- flush table with read lock的轻量级解决方案
为什么要使用FTWRL MySQL dba在日常工作中,数据备份绝对是工作频度最高的工作内容之一.当你使用逻辑方式进行备份(mydumper,mysqldump)或物理方式进行备份(percona ...
- WPF判断两个时间大小避免误差
进行查询操作的时候,经常用到判断开始时间和结束时间大小的条件,由于从控件上获取的时间除了年月日时分秒,还包括毫秒.微秒等,导致直接判断时间大小的时候会产生一些误差,如下: 结果分析:年月日时分秒一致的 ...
- 判断浏览器 插件 jquery.ua.js
判断浏览器 插件 jquery.ua.js /*! * jquery.ua.js * @link https://github.com/cloudcome/jquery.ua * @author yd ...
- jQuery基础---Ajax基础
内容提纲: 1.Ajax 概述 2.load()方法 3.$.get()和$.post() 4.$.getScript()和$.getJSON() 5.$.ajax()方法 6.表单序列化 发文不易, ...
- C/C++:Windows cmd 指令
一.快捷键1. Windows键 自从104键盘首次加入Windows键后,微软便一直计划为这个键添加更多功能,当然Win8也不例外. * Win+C:调出应用Charm菜单(Metro.传统桌面) ...
- spring boot2 使用log4j2
spring boot默认使用的是logback,看到好多地方说logback比log4j耗性能,具体么我也没试过,不过个人还是log4j用得更多. 先看pom依赖 <dependency> ...
- Hunger Snake 2
- dbUtils 中的各种 Handler 什么 意思
ArrayHandler:把结果集中的第一行数据转成对象数组. ArrayListHandler:把结果集中的每一行数据都转成一个对象数组,再存放到List中. BeanHandler:将结果集中的第 ...
- 基于.Net下整合IBatis
一. 准备工作 1. 点击此下载支持.Net4.0的 iBatis.Net,工程中引用release文件夹下的dll 最新版(目前已不再更新),有稍作修改使其支持.NET4.0 2. 点击此可查看 i ...
- MySQL9:索引实战 (转)
构建50万条数据过程: DROP TABLE IF EXISTS `students`; CREATE TABLE `students` ( `s_id` ) NOT NULL AUTO_INCREM ...