【BZOJ 4282】慎二的随机数列
2016-12-29 12:59
127 查看
题目来源:BZOJ 4282
思路:
题目要求一个数列的最长上升子序列的长度,因为n是整数,所以不难发现在最优的答案里,所有不清楚的数字应该全部出现在其中。很显然的一点是,如果可以的话,在答案序列中出现一个模糊不清的数一定不会比不出现时的答案要差(考虑那一个数最多替换下去一个数)。因为空的一定要选,就相等价的转换为后面的数都变小了,根据差分的思想,不难想到发生的实质变化就是保证了所有的不清楚的数字全部选入,因为两个正常数字的差相对于原来,变小的部分就是模糊不清的部分。
(我怎么感觉没说明白。。。)
看代码吧,也许一下子就领悟到了。
代码:
#include <cstdio> const int maxn = 100010; const int inf = 2e9; int n, ct, p, ans, v[maxn], f[maxn], g[maxn]; char c[5]; int find(int l, int r, int val){ int res = 0; while(l <= r){ int mid = (l+r)>>1; if(g[mid] < val) res = mid, l = mid + 1; else r = mid - 1; } return res; } int main(){ scanf("%d", &n); for(int i = 1; i <= n; i ++){ scanf("%s", c); if(c[0] == 'K') scanf("%d", &v[++p]), v[p] -= ct; else ct ++; } g[0] = -inf; for(int i = 1; i <= p; i ++) g[i] = inf; for(int i = 1; i <= p; i ++){ f[i] = find(0, i-1, v[i]) + 1; if(ans < f[i]) ans = f[i]; if(g[f[i]] > v[i]) g[f[i]] = v[i]; } printf("%d", ans + ct); return 0; }
相关文章推荐
- 【BZOJ4282】慎二的随机数列
- [DP LIS] BZOJ 4282 慎二的随机数列
- BZOJ 4282: 慎二的随机数列|动态规划
- [bzoj4282]慎二的随机数列
- 【BZOJ4282】慎二的随机数列 乱搞
- [bzoj4282]慎二的随机数列_动态规划_贪心
- bzoj 4282: 慎二的随机数列 最长不下降序列
- [BZOJ5427]最长上升子序列/[BZOJ4282]慎二的随机数列
- BZOJ4282: 慎二的随机数列
- BZOJ 4282 慎二的随机数列 动态规划
- 【bzoj4282】【慎二的随机数列】【dp】
- BZOJ 4282 慎二的随机数列 LIS
- BZOJ4282 : 慎二的随机数列
- 【BZOJ4282】慎二的随机数列(LIS)
- bzoj 4282: 慎二的随机数列
- 【bzoj4282】慎二的随机数列
- 【bzoj4282】慎二的随机数列
- 4282: 慎二的随机数列 DP
- 【NOI2014模拟6.20】慎二的随机数列
- BZOJ 4287(慎二的随机数列-构造+LIS)