题目链接

BZOJ5158

题解

题中所给的最长上升子序列其实就是一个限制条件

我们要构造出最大的以\(i\)开头的最长下降子序列,就需要编号大的点的权值尽量小

相同时当然就没有贡献,所以我们不妨令权值为一个\(1\)到\(n\)的排列

考虑如何满足限制条件

对于所有\(a[i] = v\)的点,点与点之间一定是单调下降的,连边

对于位置\(i\),如果\(a[i] = v\),那么\(i\)至少要比上一个\(a[j] = v - 1\)的位置大,连边

然后用大顶堆拓扑排序即可得到每个点最优的权值

\(O(nlogn)\)求一遍最长下降子序列长度即可

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<queue>
  5. #include<cstring>
  6. #include<algorithm>
  7. #define LL long long int
  8. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  9. #define REP(i,n) for (int i = 1; i <= (n); i++)
  10. #define cls(s) memset(s,0x3f3f3f3f,sizeof(s))
  11. using namespace std;
  12. const int maxn = 100005,maxm = 100005,INF = 1000000000;
  13. inline int read(){
  14. int out = 0,flag = 1; char c = getchar();
  15. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  16. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  17. return out * flag;
  18. }
  19. int h[maxn],ne = 2,de[maxn];
  20. struct EDGE{int to,nxt;}ed[maxn << 1];
  21. inline void build(int u,int v){
  22. ed[ne] = (EDGE){v,h[u]}; h[u] = ne++;
  23. de[v]++;
  24. }
  25. int last[maxn],n,a[maxn],cnt,x[maxn],f[maxn],bac[maxn];
  26. priority_queue<int> q;
  27. void work(){
  28. REP(i,n) if (!de[i]) q.push(i);
  29. int u;
  30. while (!q.empty()){
  31. u = q.top(); q.pop();
  32. x[u] = ++cnt;
  33. Redge(u) if (!(--de[to = ed[k].to])) q.push(to);
  34. }
  35. }
  36. int getn(int t){
  37. int l = 0,r = n,mid;
  38. while (l < r){
  39. mid = (l + r + 1) >> 1;
  40. if (bac[mid] < t) l = mid;
  41. else r = mid - 1;
  42. }
  43. return l;
  44. }
  45. void cal(){
  46. cls(bac); bac[0] = 0;
  47. for (int i = n; i; i--){
  48. f[i] = getn(x[i]) + 1;
  49. bac[f[i]] = min(bac[f[i]],x[i]);
  50. }
  51. LL ans = 0;
  52. REP(i,n) ans += f[i];
  53. printf("%lld\n",ans);
  54. }
  55. int main(){
  56. n = read();
  57. REP(i,n) a[i] = read();
  58. for (int i = 1; i <= n; i++){
  59. if (a[i] > 1) build(last[a[i] - 1],i);
  60. if (last[a[i]]) build(i,last[a[i]]);
  61. last[a[i]] = i;
  62. }
  63. work();
  64. cal();
  65. return 0;
  66. }

BZOJ5158 [Tjoi2014]Alice and Bob 【贪心 + 拓扑】的更多相关文章

  1. [bzoj5158][Tjoi2014]Alice and Bob

    好羞愧啊最近一直在刷水... 题意:给定序列$c$的$a_i$,构造出一个序列$c$使得$\sum b_i$最大. 其中$a_i$表示以$c_i$结尾的最长上升子序列长度,$b_i$表示以$c_i$为 ...

  2. Alice and Bob(贪心HDU 4268)

    Alice and Bob Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...

  3. HDU 4268 Alice and Bob 贪心STL O(nlogn)

    B - Alice and Bob Time Limit:5000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u D ...

  4. [TJOI2014]Alice and Bob[拓扑排序+贪心]

    题意 给出一个序列的以每一项结尾的 \(LIS\) 的长度a[],求一个序列,使得以每一项为开头的最长下降子序列的长度之和最大. \(n\leq 10^5\) . 分析 最优解一定是一个排列,因为如果 ...

  5. [TJOI2014] Alice and Bob

    非常好的一道思维性题目,想了很久才想出来qwq(我好笨啊) 考虑a[]数组有什么用,首先可以yy出一些性质 (设num[i]为原来第i个位置的数是什么 , 因为题目说至少有一个排列可以满足a[],所以 ...

  6. [BZOJ 5158][Tjoi2014]Alice and Bob

    传送门 \(\color{green}{solution}\) 贪心 /************************************************************** P ...

  7. HDU4268 Alice and Bob(贪心+multiset)

    Problem Description Alice and Bob's game never ends. Today, they introduce a new game. In this game, ...

  8. 关于TJOI2014的一道题——Alice and Bob

    B Alice and Bob •输入输出文件: alice.in/alice.out •源文件名: alice.cpp/alice.c/alice.pas • 时间限制: 1s 内存限制: 128M ...

  9. HDU 4268 Alice and Bob(贪心+Multiset的应用)

     题意: Alice和Bob有n个长方形,有长度和宽度,一个矩形能够覆盖还有一个矩形的条件的是,本身长度大于等于还有一个矩形,且宽度大于等于还有一个矩形.矩形不可旋转.问你Alice最多能覆盖Bo ...

随机推荐

  1. linux:eth网卡对应的物理网口判断

    可以利用ethtool命令 #ethtool -p eth0 执行上述命令则相应的物理网口会闪烁,则可以判断对应的物理网口 注:应在不插网线的情况下测试

  2. 正则(re 模块)

    就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C 编写的匹 ...

  3. 处理nginx访问日志,筛选时间大于1秒的请求

    #!/usr/bin/env python ''' 处理访问日志,筛选时间大于1秒的请求 ''' with open('test.log','a+',encoding='utf-8') as f_a: ...

  4. python学习之map函数和reduce函数的运用

    MapReduce:面向大型集群的简化数据处理引文 map()函数 Python中的map()函数接收两个参数,一个是调用函数对象(python中处处皆对象,函数未实例前也可以当对象一样调用),另一个 ...

  5. python-7面向对象高级编程

    1-给类动态增加方法 class Student(object): pass def set_score(self, score): self.score = score Student.set_sc ...

  6. SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。

    可以查看到pycharm右下角文件的编码方式, 如果编码方式不一致,则在设置中修改编码方式: http://jingyan.baidu.com/article/c843ea0ba55f0977931e ...

  7. 当Hadoop 启动节点Datanode失败解决

    Hadoop 启动节点Datanode失败解决 [日期:2014-11-01] 来源:Linux社区  作者:shuideyidi [字体:大 中 小] 当我动态添加一个Hadoop从节点的之后,出现 ...

  8. 【Dual Support Vector Machine】林轩田机器学习技法

    这节课内容介绍了SVM的核心. 首先,既然SVM都可以转化为二次规划问题了,为啥还有有Dual啥的呢?原因如下: 如果x进行non-linear transform后,二次规划算法需要面对的是d`+1 ...

  9. java中封装的概念

    封装(Encapsulation)是类的三大特性之一, 就是将类的状态信息隐藏在类的内部,不允许外部程序直接访问, 而是通过该类提供的方法来实现对隐藏信息的操作和访问. 简而言之,就是隐藏内部实现,提 ...

  10. gulp批量添加版本号

    要实现的理想效果: "/css/style.css" => "/dist/css/style.css?v=1d87bebe""/js/scrip ...