题目传送门(内部题126)


输入格式

  第一行两个个整数$n,m$表示区间的长度与彩灯的数量。
  接下来$m$行,每行三个整数$l_i,r_i,a_i$表示一条彩灯能够覆盖的区间以及它的美观程度。


输出格式

  输出一行$m$个整数,第$i$个数表示$k=i$时的最大美观程度。


样例

样例输入:

25 6
1 2 10
2 3 10
1 3 21
3 4 10
4 5 10
3 5 19

样例输出:

41 80 80 80 80 80


数据范围与提示

  对于$25\%$的数据,$m\leqslant 20$
  对于$45\%$的数据,$n,m\leqslant 5,000$
  对于另外$25\%$的数据,所有$a_i$相同
  对于$100\%$的数据,$1\leqslant l_i\leqslant r_i\leqslant n,m\leqslant 300,000,a_i\leqslant 10^9$


题解

因为不能重叠,所以将所有的区间向其覆盖的区间连边,单调栈维护即可。

然后会得到一棵树,对于每一个节点维护一个单调队列更新其父节点答案即可,思想类似树上$DP$。

时间复杂度:$\Theta(n\log n)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. struct rec{int id,l,r,a;}s[400001];
  4. struct node{int nxt,to;}e[700001];
  5. int head[400001],cnt;
  6. int n,m;
  7. int now=2;
  8. int size[300001];
  9. long long ans;
  10. priority_queue<long long> q[400001],v;
  11. bool cmp(rec a,rec b){return a.l<b.l||(a.l==b.l&&a.r>b.r)||(a.l==b.l&&a.r==b.r&&a.id>b.id);}
  12. void add(int x,int y)
  13. {
  14. e[++cnt].nxt=head[x];
  15. e[cnt].to=y;
  16. head[x]=cnt;
  17. }
  18. void build(int x)
  19. {
  20. while(s[x].l<=s[now].l&&s[now].r<=s[x].r)
  21. {
  22. add(x,now);
  23. now++;
  24. build(now-1);
  25. }
  26. }
  27. void dfs(int x)
  28. {
  29. for(int i=head[x];i;i=e[i].nxt)
  30. {
  31. dfs(e[i].to);
  32. size[x]=max(size[x],size[e[i].to]);
  33. }
  34. size[x]++;
  35. for(int i=head[x];i;i=e[i].nxt)
  36. if(size[e[i].to]+1==size[x]){swap(q[x],q[e[i].to]);e[i].to=0;break;}
  37. for(int i=head[x];i;i=e[i].nxt)
  38. {
  39. if(e[i].to)
  40. {
  41. while(q[e[i].to].size())
  42. {
  43. v.push(q[x].top()+q[e[i].to].top());
  44. q[x].pop();q[e[i].to].pop();
  45. }
  46. swap(v,q[x]);
  47. while(v.size())
  48. {
  49. q[x].push(v.top());
  50. v.pop();
  51. }
  52. }
  53. }
  54. q[x].push(s[x].a);
  55. }
  56. int main()
  57. {
  58. scanf("%d%d",&n,&m);n--;
  59. for(int i=1;i<=m;i++)
  60. {
  61. s[i].id=i;
  62. scanf("%d%d%d",&s[i].l,&s[i].r,&s[i].a);
  63. s[i].r--;
  64. }
  65. s[++m]=(rec){m,1,n,0};
  66. sort(s+1,s+m+1,cmp);
  67. build(1);dfs(1);
  68. for(int i=1;i<=m;i++)q[1].push(0);
  69. for(int i=1;i<m;i++)
  70. {
  71. ans+=q[1].top();
  72. q[1].pop();
  73. printf("%lld ",ans);
  74. }
  75. return 0;
  76. }

rp++

[CSP-S模拟测试]:Cover(单调栈++单调队列+DP)的更多相关文章

  1. 单调栈&单调队列入门

    单调队列是什么呢?可以直接从问题开始来展开. Poj 2823 给定一个数列,从左至右输出每个长度为m的数列段内的最小数和最大数. 数列长度:\(N <=10^6 ,m<=N\) 解法① ...

  2. POJ 3250 Bad Hair Day --单调栈(单调队列?)

    维护一个单调栈,保持从大到小的顺序,每次加入一个元素都将其推到尽可能栈底,知道碰到一个比他大的,然后res+=tail,说明这个cow的头可以被前面tail个cow看到.如果中间出现一个超级高的,自然 ...

  3. 单调栈&单调队列学习笔记!

    ummm,,,都是单调系列就都一起学了算了思想应该都差不多呢qwq 其实感觉这俩没有什么可说的鸭QAQ就是维护一个单调的东西,区别在于单调栈是一段进一段出然后单调队列是一段进另一段出?没了 好趴辣重点 ...

  4. 小结:单调栈 & 单调队列

    概要: 对于维护信息具有单调性的性质或者问题可以转化为具有单调性质的模型的题,我们可以考虑用单调栈或单调队列. 技巧及注意: 技巧很多,只要能将问题转化为单调性问题,就好解决了. 当维护固定长度的单调 ...

  5. 单调栈&单调队列

    最近打了三场比赛疯狂碰到单调栈和单调队列的题目,第一,二两场每场各一个单调栈,第三场就碰到单调队列了.于是乎就查各种博客,找单调栈,单调队列的模板题去做,搞着搞着发现其实这两个其实是一回事,只不过利用 ...

  6. HZNU-ACM寒假集训Day10小结 单调栈-单调队列

    数据结构往往可以在不改变主算法的前提下题高运行效率,具体做法可能千差万别,但思路却是有规律可循 经典问题:滑动窗口  单调队列O(n) POJ 2823 我开始写的: TLE 说明STL的库还是有点慢 ...

  7. 联赛模拟测试18 A. 施工 单调队列(栈)优化DP

    题目描述 分析 对于 \(Subtask\ 1\),可以写一个 \(n^3\) 的 \(DP\),\(f[i][j]\) 代表第 \(i\) 个建筑高度为 \(j\) 时的最小花费,随便转移即可 时间 ...

  8. [CSP-S模拟测试]:小P的单调数列(树状数组+DP)

    题目描述 小$P$最近喜欢上了单调数列,他觉得单调的数列具有非常多优美的性质.经过小$P$复杂的数学推导,他计算出了一个单调增数列的艺术价值等于该数列中所有书的总和.并且以这个为基础,小$P$还可以求 ...

  9. ACM数据结构-单调栈、队列

    1.最大数 代码: #include <stdio.h> #include <memory.h> #include <math.h> #include <st ...

随机推荐

  1. 第一次编译ffmpeg

    今天开始玩ffmpeg了. 从官网下载来的压缩包,不会编译诶,于是我开始研究起来了. 下面就是实时记录的随笔: 首先是从官网下载来的ffmpeg,就是下面这个版本,目前的最新版吧. http://ff ...

  2. java各种jar的下载地址和源码下载地址

    1.jboss http://jbossmarshalling.jboss.org/downloads2.netty https://netty.io/downloads.html3.spring h ...

  3. sql--Drop语句

    通过使用 DROP 语句,可以轻松地删除索引.表和数据库. SQL DROP INDEX 语句 我们可以使用 DROP INDEX 命令删除表格中的索引. 用于 Microsoft SQLJet (以 ...

  4. Git复习(九)之理解git工作区和暂存区

    前言 Git和其他版本控制系统如SVN的一个不同之处就是有暂存区的概念. 版本库 在工作区目录中有一个.git文件,这个其实不是工作区而是Git的版本库 版本库中包含两个部分,一个是暂存区index/ ...

  5. 分布式的几件小事(三)dubbo的通信协议与序列化

    1.dubbo的通信协议 ①dubbo协议 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的情况. 特点 : dubbo缺 ...

  6. VS2017 VS2019 无法进入安装界面闪退问题(windows7SP1)

    如果离线安装 Visual Studio 2017/2019出现“即将完成…一切即将准备就绪.”的画面后,等几秒安装程序没有任何错误提示就关闭了,无法继续安装. 解决方法: 将vs_enterpris ...

  7. 4.(基础)tornado应用安全与认证

    这一节我们介绍应用安全与认证,其实中间省略了一个数据库.对于tornado来说,读取数据库的数据,性能的瓶颈还是在数据库上面.关于数据库,我在<>中介绍了sqlalchemy,这是一个工业 ...

  8. epoll机制和简述

    在linux的网络编程中,很长的时间都在使用select来做事件触发.在linux新的内核中,有了一种替换它的机制,就是epoll.相比于select,epoll最大的好处在于它不会随着监听fd数目的 ...

  9. Django学习系列16:处理完POST请求后重定向

    处理完POST请求后重定向 代码中new_item_text = ''的写法不怎么样.解决第二个问题时候,顺带把这个问题也解决了. 人们都说处理完post请求后一定要重定向,接下来就实现这个功能吧.修 ...

  10. Tableau预测

    Tableau可以通过对现有的数据进行预测.