洛谷 P4093 [HEOI2016/TJOI2016]序列(Cdq+dp)
题面
题解
\(Cdq分治+dp\)
\(mx[i],mn[i]\)分别表示第\(i\)位最大,最小能取到多少
那么有
\(j < i\)
\(mx[j] \le a[i]\)
\(a[j] \le mn[i]\)
然后就有了50分 \(O(n^2)\)的\(dp\)
上面那个东西是个三维偏序,
\(Cdq\)优化一下即可。
Code
50pts
#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std;
template<class T> inline void read(T &x) {
x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
x = f ? -x : x;
return ;
}
template<class T> inline void write(T x) {
if (!x) {putchar(48);return ;}
if (x < 0) x = -x, putchar('-');
int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
}
const int N = 100010;
int a[N];
int mx[N], mn[N], f[N];
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
int n, m; read(n); read(m);
for (int i = 1; i <= n; i++) read(a[i]), mx[i] = mn[i] = a[i], f[i] = 1;
for (int i = 1; i <= m; i++) {
int x, y; read(x), read(y);
mx[x] = max(mx[x], y);
mn[x] = min(mn[x], y);
}
int ans = 0;
for (int i = 2; i <= n; i++)
for (int j = 1; j < i; j++)
if (a[i] >= mx[j] && mn[i] >= a[j])
f[i] = max(f[i], f[j]+1), ans = max(ans, f[i]);
printf("%d\n", ans);
return 0;
}
100pts
#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std;
template<class T> inline void read(T &x) {
x = 0; RG char c = getchar(); bool f = 0;
while (c != '-' && (c < '0' || c > '9')) c = getchar(); if (c == '-') c = getchar(), f = 1;
while (c >= '0' && c <= '9') x = x*10+c-48, c = getchar();
x = f ? -x : x;
return ;
}
template<class T> inline void write(T x) {
if (!x) {putchar(48);return ;}
if (x < 0) x = -x, putchar('-');
int len = -1, z[20]; while (x > 0) z[++len] = x%10, x /= 10;
for (RG int i = len; i >= 0; i--) putchar(z[i]+48);return ;
}
const int N = 100010;
int a[N], b[N*4], tot, mx[N], mn[N];
int f[N], n, m;
int t[N], p[N];
#define lowbit(x) (x&(-x))
void add(int x, int k) {
while (x <= tot) {
t[x] = max(t[x], k);
x += lowbit(x);
}
return ;
}
void clr(int x) {
while (x <= tot) {
t[x] = 0;
x += lowbit(x);
}
return ;
}
int query(int x) {
int s = 0;
while (x) {
s = max(s, t[x]);
x -= lowbit(x);
}
return s;
}
inline bool cmp1(int i, int j) { return mx[i] < mx[j]; }
inline bool cmp2(int i, int j) { return a[i] < a[j]; }
void solve(int l, int r) {
if (l == r) {
f[l] = max(1, f[l]);
return ;
}
int mid = (l + r) >> 1;
solve(l, mid);
for (int i = l; i <= r; i++)
p[i] = i;
sort(p+l, p+mid+1, cmp1); sort(p+mid+1, p+r+1, cmp2);
for (int i = mid+1, j = l; i <= r; i++) {
while (j <= mid && mx[p[j]] <= a[p[i]]) {
add(a[p[j]], f[p[j]]);
j++;
}
f[p[i]] = max(f[p[i]], query(mn[p[i]])+1);
}
for (int i = l; i <= mid; i++)
clr(a[i]);
solve(mid+1, r);
return ;
}
int main() {
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
read(n); read(m);
for (int i = 1; i <= n; i++) {
read(a[i]), mx[i] = mn[i] = a[i];
b[++tot] = a[i];
}
for (int i = 1; i <= m; i++) {
int x, y; read(x), read(y);
mx[x] = max(mx[x], y);
mn[x] = min(mn[x], y);
}
for (int i = 1; i <= n; i++) b[++tot] = mx[i], b[++tot] = mn[i];
sort(b+1, b+1+tot);
tot = unique(b+1, b+1+tot)-b-1;
for (int i = 1; i <= n; i++) {
a[i] = lower_bound(b+1, b+1+tot, a[i])-b;
mx[i] = lower_bound(b+1, b+1+tot, mx[i])-b;
mn[i] = lower_bound(b+1, b+1+tot, mn[i])-b;
}
solve(1, n);
int ans = 0;
for (int i = 1; i <= n; i++)
ans = max(ans, f[i]);
printf("%d\n", ans);
return 0;
}
洛谷 P4093 [HEOI2016/TJOI2016]序列(Cdq+dp)的更多相关文章
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP
洛谷 P4093 [HEOI2016/TJOI2016]序列 CDQ分治优化DP 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他. 玩具上有一个数列,数列中某些项的值可能会 ...
- 洛谷 P4093 [HEOI2016/TJOI2016]序列 解题报告
P4093 [HEOI2016/TJOI2016]序列 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一 ...
- BZOJ4553/洛谷P4093 [HEOI2016/TJOI2016]序列 动态规划 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8672434.html 题目传送门 - BZOJ4553 题目传送门 - 洛谷P4093 题解 设$Li$表示第$ ...
- 洛谷P4093 [HEOI2016/TJOI2016]序列
题目描述 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能会变化,但同一个时刻最多只有一个值发生变化.现在佳媛姐姐已经研究出了所有变化的可能性, ...
- 洛谷 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]序列 CDQ分治+动态规划
你发现只会改变一个位置,所以可以直接进行dp 具体转移的话用 CDQ 分治转移就好了~ #include <bits/stdc++.h> #define N 100006 #define ...
- Luogu P4093 [HEOI2016/TJOI2016]序列 dp套CDQ
题面 好久没写博客了..最近新学了CDQ...于是就来发一发一道CDQ的练习题 看上去就是可以dp的样子. 设\(dp_{i}\)为以i结尾的最长不下降序列. 易得:\(dp_{i}\)=\(max( ...
- [HEOI2016/TJOI2016]序列 CDQ分治
---题面--- 题解: 首先我们观察一下,如果一个点对(j, i), 要符合题中要求要满足哪些条件? 首先我们设 j < i 那么有: j < i max[j] < v[i] v[ ...
随机推荐
- css四可见,部分可见和重叠半透明
<html> <head> <title>javascript</title> <style type="text/css"& ...
- 3-No resource found that matches the given name 'Theme.AppCompat.Light 的完美解决方案
转载:http://www.360doc.com/content/15/0316/15/9200790_455576135.shtml 由于我在配置安卓环境时也碰到了类似问题,用这篇博客解决了主要问题 ...
- 更改windows服务的配置文件(app.config)必须重启服务才能生效吗?
这个问题是前一阶段写windows服务碰到的.本来在写获取配置文件的某个配置的值的时候,通常我都是写类似下面的这么一个静态方法来获取: 1: /// <summary> 2: /// 获取 ...
- sql语句in超过1000时的写法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- bootstrap三列布局
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...
- bootstrap导航菜单
<!DOCTYPE html><html lang="zh-cn"><head><meta charset="utf-8&quo ...
- 关于 Azure 安全性的 10 点提示
讨论云服务时,安全性是一个关键领域.实际上,Windows Azure 基础结构实施大量的技术和流程来保护环境.此页介绍 Microsoft 的全球基础服务如何运行基础结构以及它们实施的安全措施. 从 ...
- UVa 1625 Color Length (DP)
题意:给定两个序列,让你组成一个新的序列,让两个相同字符的位置最大差之和最小.组成方式只能从一个序列前部拿出一个字符放到新序列中. 析:这个题状态表示和转移很容易想到,主要是在处理上面,dp[i][j ...
- 编写高质量代码改善C#程序的157个建议——建议28:理解延迟求值和主动求值之间的区别
建议28:理解延迟求值和主动求值之间的区别 要理解延迟求值(lazy evaluation)和主动求值(eager evaluation),先看个例子: List<, , , , , , , , ...
- cmake笔记
注:cmake . 当前文件夹(一个点) cmake .. 父目录(两个点) 例子一 一个经典的C程序,如何用cmake来进行构建程序呢? //main.c #include <stdi ...