Codeforces Zip-line 650D 345Div1D(LIS)
来源:互联网 发布:和弓淘宝 编辑:程序博客网 时间:2024/06/07 21:04
传送门
大意:给出一个序列,求修改一个数过后的最长上升子序列。
思路:可以用主席树在线搞,也可以用树状数组离线搞,明显后者好写得多。我们首先读取所有的询问,然后就把询问绑在给出的位置,然后我们正向做一遍LIS,反向做一遍LDS,然后就可以解决这个问题了。
#include <cstdio>#include <algorithm>#include <vector>#define MAXN 400005using namespace std;inline void GET(int &n) { char c; n = 0; do c = getchar(); while('0' > c || c > '9'); do n=n*10+c-'0',c=getchar();while('0' <= c && c <= '9');}vector<int> q[MAXN];int lm[MAXN << 1], rm[MAXN << 1], B[MAXN << 1], a[MAXN];int n, m, N, ask[MAXN], ans[MAXN], f[MAXN], g[MAXN], cnt[MAXN], qid[MAXN];inline void gmax(int &a, int b) { if(a < b) a = b; }inline void A2l(int x, int v) { for(; x <= N; x += x&-x) gmax(lm[x], v);}inline void A2r(int x, int v) { for(; x > 0; x -= x&-x) gmax(rm[x], v);}inline int Qml(int x, int v = 0) { for(; x > 0; x -= x&-x) gmax(v, lm[x]); return v;}inline int Qmr(int x, int v = 0) { for(; x <= N; x += x&-x) gmax(v, rm[x]); return v;}inline int BS(int p) { int l = 1, r = N, mid, ans = 0; while(l <= r) { mid = (l + r) >> 1; if(B[mid] >= p) { ans = mid; r=mid-1; } else l = mid+1; } return ans;}int main() { GET(n); GET(m); int id; for(int i = 1; i <= n; ++ i) { GET(a[i]); B[++ N] = a[i]; } for(int i = 1; i <= m; ++ i) { GET(qid[i]); GET(ask[i]); q[qid[i]].push_back(i); B[++ N] = ask[i]; ans[i] = 1; } sort(B + 1, B + N + 1); N = unique(B + 1, B + N + 1) - B-1; for(int i = 1; i <= n; ++ i) a[i] = BS(a[i]); for(int i = 1; i <= m; ++ i) ask[i] = BS(ask[i]); int lgst = 0; for(int i = 1; i <= n; ++ i) { for(auto j : q[i]) ans[j] += Qml(ask[j]-1); f[i] = Qml(a[i]-1) + 1; A2l(a[i], f[i]); lgst = max(lgst, f[i]); } for(int i = n; i > 0; -- i) { for(auto j : q[i]) ans[j] += Qmr(ask[j]+1); g[i] = Qmr(a[i]+1) + 1; A2r(a[i], g[i]); } for(int i = 1; i <= n; ++ i) if(f[i] + g[i] == lgst + 1) ++ cnt[ f[i] ]; for(int i = 1; i <= m; ++ i) if(f[qid[i]] + g[qid[i]] == lgst + 1 && 1 == cnt[ f[qid[i]] ]) printf("%d\n", max(ans[i], lgst-1)); else printf("%d\n", max(ans[i], lgst)); return 0;}
0 0
- Codeforces Zip-line 650D 345Div1D(LIS)
- Codeforces #345 div1 D. Zip-line LIS dp
- codeforces 650 D. Zip-line
- codeforces 650d Zip-line
- Codeforces Round #345 (Div. 1) D. Zip-line LIS 离线 离散化 线段树
- [DP] codeforces 650D. Zip-line
- Codeforces 650D. Zip-line (动态LIS) (可持久化线段树 或 离线+树状数组)
- CodeForces 650D Zip-line(最长上升子序列)
- Codeforces Round #345 (Div. 1) D. Zip-line
- Codeforces Round #345 (Div. 1) D. Zip-line
- codeforces #345 (Div. 1) D. Zip-line (线段树+最长上升子序列)
- Codeforces Round #250 Div1D 438D The Child and Sequence 线段树+势能分析
- CodeForces 827D Round #423 Div2F&Div1D:LCA+路径压缩+MST(最小生成树)
- Codeforces #323 D. Once Again... (LIS)
- codeforces 583 D. Once Again... (LIS + 贪心)
- Codeforces Round #323 (Div. 2)D lis
- D - LIS
- Codeforces Round #323 (Div. 2) D题 (LIS)
- 操作系统汇编语言实现彩色输出斐波拉契数列
- java中volatile关键字的含义
- mysql 查询一张表没有存在在另一张表的数据
- dnsmasq在DRBL中的使用
- tornado, twister, cyclone,Typhoon,hurricane…到底如何区别?
- Codeforces Zip-line 650D 345Div1D(LIS)
- 压缩与解压指定目录下的指定文件
- 获取gridview当前选中行的内容
- 在字符串中存储二进制数据的方法和要点
- 【codevs1257】打砖块 DP
- Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate ent
- Java 获取指定字符串出现的次数
- --------------------------STDAPI释义-----------------------------------
- IOS中获取各个文件的目录路径的方法和NSFileManager类