题目传送门(内部题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$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int id,l,r,a;}s[400001];
struct node{int nxt,to;}e[700001];
int head[400001],cnt;
int n,m;
int now=2;
int size[300001];
long long ans;
priority_queue<long long> q[400001],v;
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);}
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void build(int x)
{
while(s[x].l<=s[now].l&&s[now].r<=s[x].r)
{
add(x,now);
now++;
build(now-1);
}
}
void dfs(int x)
{
for(int i=head[x];i;i=e[i].nxt)
{
dfs(e[i].to);
size[x]=max(size[x],size[e[i].to]);
}
size[x]++;
for(int i=head[x];i;i=e[i].nxt)
if(size[e[i].to]+1==size[x]){swap(q[x],q[e[i].to]);e[i].to=0;break;}
for(int i=head[x];i;i=e[i].nxt)
{
if(e[i].to)
{
while(q[e[i].to].size())
{
v.push(q[x].top()+q[e[i].to].top());
q[x].pop();q[e[i].to].pop();
}
swap(v,q[x]);
while(v.size())
{
q[x].push(v.top());
v.pop();
}
}
}
q[x].push(s[x].a);
}
int main()
{
scanf("%d%d",&n,&m);n--;
for(int i=1;i<=m;i++)
{
s[i].id=i;
scanf("%d%d%d",&s[i].l,&s[i].r,&s[i].a);
s[i].r--;
}
s[++m]=(rec){m,1,n,0};
sort(s+1,s+m+1,cmp);
build(1);dfs(1);
for(int i=1;i<=m;i++)q[1].push(0);
for(int i=1;i<m;i++)
{
ans+=q[1].top();
q[1].pop();
printf("%lld ",ans);
}
return 0;
}

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. DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension)

    DAX/PowerBI系列 - 关于时间系列 - 如何用脚本生成时间维度 (Generate TIME Dimension) 难度: ★☆☆☆☆(1星) 适用范围: ★★★★★(5星) 这个时间系列想 ...

  2. QVector与QMap查找效率实战(QMap快N倍,因为QVector是数组,QMap是有序二叉树,查找的时候是N和LogN的速度对比)

    因为项目使用QVector,太慢了,听说QMap比QVector查找时快,所以写一个小程序试试: 从30000个数据中找5000个 程序运行截图如下: QVector QMap 一样的数据,找一样的数 ...

  3. The minimal unique substring CodeForces - 1159D (构造)

    核心观察是形如01,001,0001,...的串循环时, $n$每增长1, $k$就增长1. #include <iostream> #include <sstream> #i ...

  4. js文件的框架

    Ext.define("BeidaSoft.SFJCGL.rcjwgl.bdgl.BdglGrid", { extend : "BeidaSoft.XTGL.base.Q ...

  5. 转载:elasticsearch入门篇

    转自:https://www.cnblogs.com/hello-shf/p/11543408.html elasticsearch入门篇   elasticsearch专栏:https://www. ...

  6. jq选择CheckBox进行排序

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <meta name=& ...

  7. C++ GB2312 和 utf8 在win32下 互转

    string ANSItoUTF8(const char* strAnsi) { //获取转换为宽字节后需要的缓冲区大小,创建宽字节缓冲区,936为简体中文GB2312代码页 , NULL, NULL ...

  8. linux进程间的通信方式

    linux进程间的通信 进程间的通信就是不同的进程之间传播或交换信息,进程的用户空间是互相独立,进程之间可以利用系统空间交换信息. 管道 允许将一个进程的标准输出和另一个进程的标准输入连接在一起,主要 ...

  9. vi 纵向模式编辑

    Vim 的纵向编辑模式 vim解读 vi解读 批量删除# 技巧: r 进入修改模式 I 进入行首插入模式 A 进入行尾插入模式 r替换 I前前添加 A后添加 1.多行注释: a. 按下Ctrl + v ...

  10. Zen Cart 常用SQL命令

    网店日常维护过程中,难免要跟各种批量操作打交道, 虽然大多数操作可以通过批量上传 (easy populate) 和 快速更新 模块来完成, 但在应用便捷性和一些功能性的调整上, 总有一定的局限性; ...