题面$

link
  定义了长度为 kkk 的几乎递增序列 {bi}\{b_i\}{bi​} 为: min(b1,b2)≤min(b2,b3)≤...min(bk−1,bk)min(b_1, b_2) ≤ min(b_2, b_3) ≤ ... min(b_{k - 1}, b_k)min(b1​,b2​)≤min(b2​,b3​)≤...min(bk−1​,bk​)。
  现在给定了一个长度为 n(n≤5e5)n \ (n ≤ 5e5)n (n≤5e5) 的数组 {ai}(1≤ai≤n)\{a_i\} \ ( 1 ≤a_i ≤ n){ai​} (1≤ai​≤n),求几乎递增子序列的最长长度。

分析

  我们可以得到,对于一个长度为 kkk 的几乎递增序列 {bi}(1≤i≤k)\{b_i\} (1 ≤ i ≤ k){bi​}(1≤i≤k) ,当 i≥3i ≥ 3i≥3 时,有 bi≥min(bi−1,bi−2)b_i ≥ min(b_{i-1}, b_{i-2})bi​≥min(bi−1​,bi−2​) 成立,即要么大于等于它前一个数,要么大于等于其前前一个数。如果我们定义了 b0=0b_0 = 0b0​=0,那么对于 i≥2i ≥ 2i≥2 都成立。
  如果定义以 bib_ibi​ 结尾的几乎递增序列的最大长度为 dp[i]dp[i]dp[i] ,则有三种转移情况:
  ①为一个子序列的首部,即 dp[i]=1dp[i] = 1dp[i]=1;
  ②对于已有子序列 {bm1,bm2,...bmk}\{b_{m1}, b_{m2}, ...b_{mk}\}{bm1​,bm2​,...bmk​},有 bi≥bmkb_i ≥ b_{m_k}bi​≥bmk​​,即大于等于最后一个数,也就是对于 j<ij < ij<i, 满足 a[j]≤a[i]a[j] ≤ a[i]a[j]≤a[i],则 dp[i]=max(dp[j]+1)dp[i] = max(dp[j] + 1)dp[i]=max(dp[j]+1);
  ③对于已有子序列 {bm1,bm2,...bmk−1,bmk}\{b_{m1}, b_{m2}, ...b_{mk-1}, b_{mk}\}{bm1​,bm2​,...bmk−1​,bmk​},若 bmk−1≥bmkb_{mk-1} ≥ b_{mk}bmk−1​≥bmk​,那么肯定也能从 bmkb_{mk}bmk​ 转移过来,我们这里就不考虑,只考虑 bmk−1<bmkb_{mk-1} < b_{mk}bmk−1​<bmk​ 的情况,也就是对于 j1<j2<ij_1 < j_2 < ij1​<j2​<i, 满足 a[j1]<a[j2],a[j1]≤a[i]a[j_1] < a[j_2], \ a[j_1] ≤ a[i]a[j1​]<a[j2​], a[j1​]≤a[i],则 dp[i]=max(dp[j1]+2)dp[i] = max(dp[j_1] + 2)dp[i]=max(dp[j1​]+2);
  
  对于 ①、②两种情况,由于 {ai}(1≤ai≤n)\{a_i\} \ ( 1 ≤a_i ≤ n){ai​} (1≤ai​≤n),可以分别用两棵线段树来记录当前满足条件的值的最大值,如①,可以在第一棵线段树查询最后一个值在 [0,a[i]][0, a[i]][0,a[i]] 的最长几乎递增序列,然后去更新a[i]a[i]a[i],对于②的话,由于需要右侧有一个数大于它,所以需要用单调栈来维护一下,当它右侧第一个大于它的数被更新后,才能更新它。

#include <bits/stdc++.h>
#include <iostream>
#include <set>
#define here printf("modassing [%s] in LINE %d\n", __FUNCTION__, __LINE__);
#define debug(x) cout << #x << ":\t" << (x) << endl;using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> P;
const int maxn = 5e5 + 10;
const int maxm = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const ll mod = 998244353;
const double pi = acos(-1.0);class Segment_Tree
{int tree[maxn << 2];public:void build(int node, int l, int r){if(l == r){tree[node] = -INF;return;}int mid =  (l + r) / 2;build(node * 2, l, mid);build(node * 2 + 1, mid + 1, r);tree[node] = -INF;}int query(int node, int l, int r, int x, int y){if(x <= l && y >= r)return tree[node];int ans = -INF, mid = (l + r) / 2;if(x <= mid) ans = max(query(node * 2, l, mid, x, y), ans);if(y > mid) ans = max(query(node * 2 + 1, mid + 1, r, x, y), ans);return ans;}void update(int node, int l, int r, int x, int c){if(l == r){tree[node] = max(tree[node], c);return;}int mid = (l + r) / 2;if(x <= mid) update(2*node, l, mid, x, c);else update(2 * node + 1, mid + 1, r, x, c);tree[node] = max(tree[node * 2], tree[node * 2 + 1]);}
}t1, t2;struct node
{int id, nxt;bool operator<(const node& m){return nxt < m.nxt;}
} pro[maxn];int t, n, a[maxn], dp[maxn];int main()
{scanf("%d", &t);while(t--){scanf("%d", &n);for (int i = 1; i <= n; i++) scanf("%d", &a[i]);for (int i = 1; i <= n; i++) pro[i].id = i;stack<P> st;for (int i = 1; i <= n; i++){while(!st.empty() && a[i] >= st.top().first){pro[st.top().second].nxt = i;st.pop();}st.push(P(a[i], i));}while(!st.empty()){pro[st.top().second].nxt = n + 1;st.pop();}//for (int i = 1; i <= n; i++)//cout << pro[i].nxt << endl;sort(pro + 1, pro + 1 + n);int cur = 0;t1.build(1, 0, n);t2.build(1, 0, n);t1.update(1, 0, n, 0, 0);for (int i = 1; i <= n; i++){dp[i] = max({1, t1.query(1, 0, n, 0, a[i]) + 1, t2.query(1, 0, n, 0, a[i]) + 2});//cout << i << " " << dp[i] << endl;while(cur < n && pro[cur].nxt <= i){t2.update(1, 0, n, a[pro[cur].id], dp[pro[cur].id]);cur++;}t1.update(1, 0, n, a[i], dp[i]);}int ans = 1;for (int i = 1; i <= n; i++)  ans = max(ans, dp[i]);printf("%d\n", ans);}
}

[单调栈+线段树] 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest ——A. LaIS相关推荐

  1. 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest A. LaIS

    题目链接 Let's call a sequence b1,b2,b3-,bk−1,bkb_1, b_2, b_3 \dots, b_{k - 1}, b_kb1​,b2​,b3​-,bk−1​,bk ...

  2. 2021-2022 ICPC, NERC, Southern and Volga Russian Regional Contest Smash the Trash(二分)

    2021-2022 ICPC, NERC, Southern and Volga Russian Regional Contest Smash the Trash(二分) 链接 题意: 思路:二分答案 ...

  3. 2021-2022 ICPC, NERC, Southern and Volga Russian Regional Contest X-Magic Pair(gcd)

    2021-2022 ICPC, NERC, Southern and Volga Russian Regional Contest X-Magic Pair(gcd) 链接 题意:给出a,b,有两种选 ...

  4. 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest B. Bakery

    题目链接 Monocarp would like to open a bakery in his local area. But, at first, he should figure out whe ...

  5. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest 部分题解ABFHJLN

    2020-10-10为了准备CCPC,师兄下午拉了场ICPC练习让我们模拟,负责读题的菜鸡晚上回来重新做了模拟场上有思路的题QAQ 文章目录 A - Berstagram B - The Feast ...

  6. 2020-2021 ICPC, NERC, Southern and Volga Russian Regional Contest K. The Robot

    翻译: 有一个机器人在一个没有尽头的方格场上.最初,机器人位于坐标为(0,0)的单元中.他将执行由一串大写拉丁字母"L"."R"."D".& ...

  7. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest

    A.Berstagram 题意:起始数列是1,2,3,--,n,给你m个操作x,表示将数字x和前一个位置的数交换,如果已经在第一个则不做操作,求每个数能到达的位置的最大和最小值: 分析:扫一遍模拟,更 ...

  8. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest B. The Feast and the Bus (经典贪心)

    题目链接 思路:先把k个团队的人数从大到小排序,我们发现s最小是num[1],那么s最大是num[1]+num[2]?可是我们这样想的话容易被毒瘤数据tle,所以还得优化一下,我们可以想我们最优的方案 ...

  9. 2019-2020 ICPC, NERC, Southern and Volga Russian Regional Contest J. The Parade(二分)

    题目链接 题意:给定身高为1-n的士兵数量,现在要求士兵分成k排,要求每一排士兵身高差不能超过1,求最多有多少士兵可以拿出来排. 思路:又是一个裸的二分题,但是写check函数的时候确遇到了bug.. ...

最新文章

  1. VS2010中“工具选项中的VC++目录编辑功能已被否决”解决方法
  2. Duwamish深入剖析-配置篇
  3. 关键词为什么迟迟不上首页?太令人“捉急”了!
  4. 协议crc计算_从零了解modbus协议 第三篇
  5. 【project】十次方-01
  6. 2022届互联网秋招备战
  7. 某个元素的距离页面的左边距_如何提高办公写作效率?先设置好页面上的这4类数据,准没错...
  8. mysql 库迁移工具_mysql数据库迁移,有什么工具或许办法
  9. 谷歌宣布Kotlin成安卓开发一级语言,我们如何来学习它
  10. 拓端tecdat|R语言IRT理论:扩展Rasch模型等级量表模型lltm、 rsm 和 pcm模型分析心理和教育测验数据可视化
  11. 计算机毕业设计JAVA房屋租赁系统mybatis
  12. java 学生学籍管理系统_JAVA测验—学生学籍管理系统
  13. MAK VR-Forces 3.7
  14. 通信原理(三)香农三大定理
  15. 【攻防世界-Web简单篇】
  16. cf 830 D1. Balance (Easy version)
  17. 椭圆方程 matlab,五点差分法(matlab)解椭圆型偏微分方程
  18. django-filer中文汉化无效的解决方案
  19. Android 6.0 状态栏信号图标分析
  20. Winform + Devexpress 实现看板效果

热门文章

  1. WinRAR 5.90 中文版 — 经典解压缩工具
  2. 【Java作业】图书管理系统
  3. Error: A cross-origin error was thrown. React doesn’t have access to the actual error object in deve
  4. Bugfree 客户端使用手册
  5. 特征匹配损失,GAN
  6. 浅谈ConcurrentDictionary与Dictionary
  7. python字体大小_python 设置xlabel,ylabel 坐标轴字体大小,字体类型
  8. 富文本编辑器 wangEditor.js
  9. 解决 ERR! ENOENT: no such file or directory, open ‘D:\xxx\xxxx\package.json‘
  10. cf 737 div2