【LOJ】#2056. 「TJOI / HEOI2016」序列
题解
这个我们处理出来每一位能变化到的最大值和最小值,包括自身
然后我们发现
\(f[i] = max(f[i],f[j] + 1) (mx[j] <= a[i] && a[j] <= mi[i])\)
喜闻乐见的三维偏序转移法
还写树套树???
直接CDQ分治就好啦
为啥他们的代码就1.xK??????
我就3.1K
代码
#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 100005
#define pb push_back
#define mp make_pair
#define eps 1e-8
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
vector<int> tr[MAXN * 4];
int mx[MAXN],mi[MAXN],a[MAXN],N,M,f[MAXN],p[MAXN],tmp[MAXN],g[MAXN];
int BIT[MAXN * 2];
int lowbit(int u) {return u & -u;}
void Insert(int u,int v) {
while(u <= 100000) {
BIT[u] = max(BIT[u],v);
u += lowbit(u);
}
}
int Query(int u) {
int res = 0;
while(u > 0) {
res = max(res,BIT[u]);
u -= lowbit(u);
}
return res;
}
void Clear(int u) {
while(u <= 100000) {
BIT[u] = 0;
u += lowbit(u);
}
}
bool cmp(int c,int d) {
return a[c] < a[d];
}
void build(int u,int l,int r) {
if(l == r) {tr[u].pb(l);return;}
int mid = (l + r) >> 1;
build(u << 1,l,mid);build(u << 1 | 1,mid + 1,r);
int s1 = 0,s2 = 0;
while(s1 < tr[u << 1].size() || s2 < tr[u << 1 | 1].size()) {
if(s2 >= tr[u << 1 | 1].size()) tr[u].pb(tr[u << 1][s1++]);
else if(s1 >= tr[u << 1].size() || a[tr[u << 1 | 1][s2]] < a[tr[u << 1][s1]]) tr[u].pb(tr[u << 1 | 1][s2++]);
else tr[u].pb(tr[u << 1][s1++]);
}
}
void Solve(int u,int l,int r) {
if(l == r) {return ;}
int mid = (l + r) >> 1;
Solve(u << 1,l,mid);
int s1 = l,s2 = 0,t;
while(s1 <= mid || s2 < tr[u << 1 | 1].size()) {
if(s2 >= tr[u << 1 | 1].size()) break;
if(s1 > mid || a[tr[u << 1 | 1][s2]] < mx[p[s1]]) {
t = tr[u << 1 | 1][s2];++s2;
f[t] = max(f[t],Query(mi[t]) + 1);
}
else {
Insert(a[p[s1]],f[p[s1]]);
++s1;
}
}
for(int i = l ; i <= mid ; ++i) Clear(a[i]);
Solve(u << 1 | 1,mid + 1,r);
s1 = l,s2 = mid + 1,t = l;
while(s1 <= mid || s2 <= r) {
if(s2 > r) tmp[t++] = p[s1++];
else if(s1 > mid || mx[p[s1]] > mx[p[s2]]) tmp[t++] = p[s2++];
else tmp[t++] = p[s1++];
}
for(int i = l ; i <= r ; ++i) p[i] = tmp[i];
return;
}
void Init() {
read(N);read(M);
for(int i = 1 ; i <= N ; ++i) {read(a[i]);mi[i] = mx[i] = a[i];p[i] = i;f[i] = 1;}
int u,v;
for(int i = 1 ; i <= M ; ++i) {
read(u);read(v);
mi[u] = min(mi[u],v);
mx[u] = max(mx[u],v);
}
build(1,1,N);
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve(1,1,N);
int ans = 0;
for(int i = 1 ; i <= N ; ++i) ans = max(ans,f[i]);
out(ans);enter;
return 0;
}
【LOJ】#2056. 「TJOI / HEOI2016」序列的更多相关文章
- loj#2054. 「TJOI / HEOI2016」树
题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...
- loj #2055. 「TJOI / HEOI2016」排序
#2055. 「TJOI / HEOI2016」排序 题目描述 在 2016 年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个 ...
- LOJ #2058「TJOI / HEOI2016」求和
不错的推柿子题 LOJ #2058 题意:求$\sum\limits_{i=0}^n\sum\limits_{j=0}^nS(i,j)·2^j·j!$其中$ S(n,m)$是第二类斯特林数 $ Sol ...
- loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增
题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在paren ...
- loj2056 「TJOI / HEOI2016」序列
当年我还没学cdq的时候在luogu上写过树套树的代码orzzz ref #include <algorithm> #include <iostream> #include & ...
- AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ
#2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include &l ...
- loj2058 「TJOI / HEOI2016」求和 NTT
loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...
- 「TJOI / HEOI2016」字符串
「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...
- AC日记——#2054. 「TJOI / HEOI2016」树
#2054. 「TJOI / HEOI2016」树 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include < ...
随机推荐
- P4888 三去矩阵
P4888 三去矩阵 给出一个字符矩阵, 多次询问求以 \((x, y)\) 为中心的最长回文串长度(即横竖两种) \(l, q <= 2000\) Solution 数据范围小直接模拟即可 C ...
- 通过ORM模型看python对象创建过程
简易django ORM模型如下所示: #!/usr/bin/env python # encoding: utf-8 """ @version: 1.0 @author ...
- 《剑指offer》 面试题43 n个骰子的点数 (java)
引言:写这篇文章的初衷只是想做个笔记,因为这道题代码量有点大,有点抽象,而书上并没有详细的注释.为了加深印象和便于下次复习,做个记录. 原题:把n个骰子扔到地上,所有骰子朝上一面的点数之后为s. 输入 ...
- 重定向(Redirect)相关的几个问题
转载自:http://hi.baidu.com/fboosjgvuvckore/item/405a1cd7be2c36e3795daa8b 此次挂接用户中心,交互大都通过重定向(Redirect)实现 ...
- Challenge 18
Challenge 18给你一个长度为 n 的非负整数序列 a 和 m 个询问 l, r, p, k,表示询问在 a[l .. r] 中 a[i]%p=k 的 i 的个数. 思路: 将序列分为根号n块 ...
- zookeeper图形工具——zkui
虽然zookeeper安装包提供了客户端工具zkcli,但是命令特别少 ,每次想看看里面的节点信息特别费劲. 幸好有图形工具——zkui,https://github.com/echoma/zkui, ...
- 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏
<HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...
- Grep学习笔记
Grep(Global search Regular Expression and Print out the line)是一种强大的文本搜索工具. 1. 正则表达式的基本组成部分 正则表达式 描述 ...
- 装好Linux后没有声音的看过来
现代的Linux发行版对声卡的支持都应该没有问题.系统装好,声卡就应该正常工作. (尤其是ArchLinux,我觉得对硬件支持最跟得上时代步伐.) 可是我用mplayer播放mp3文件却没有声音,但也 ...
- 【专题】平衡树(Treap,fhq-treap)
[旋转] 平衡树中的旋转是指在不改变中序遍历的前提下改变树的形态的方式.(中序遍历=排名顺序) 右旋将当前点的左节点旋上来,左旋反之.(图侵删) void rturn(int &k){ int ...