Description


在炽热的核熔炉中,居住着一位少女,名为灵乌路空。
据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量——核能。
核焰,可融真金。

咳咳。
每次核融的时候,空都会选取一些原子,排成一列。然后,她会将原子序列分成一些段,并将每段进行一次核融。
一个原子有两个属性:质子数和中子数。
每一段需要满足以下条件:
1、同种元素会发生相互排斥,因此,同一段中不能存在两个质子数相同的原子。
2、核融时,空需要对一段原子加以防护,防护罩的数值等于这段中最大的中子数。换句话说,如果这段原子的中子数最大为x,那么空需要付出x的代价建立防护罩。求核融整个原子序列的最小代价和。

Input


第一行一个正整数N,表示原子的个数。
接下来N行,每行两个正整数pi和ni,表示第i个原子的质子数和中子数。

Output


输出一行一个整数,表示最小代价和。

Hint


Data Constraint
对于20%的数据,1<=n<=100
对于40%的数据,1<=n<=1000
对于100%的数据,1<=n<=10^5,1<=pi<=n,1<=ni<=2*10^4

Solution


题目一股中二气息

这里可以看出是要把原子分段,我们考虑dp设f[i]为前i项都核融的最小代价,那么f[i]=min{f[j]+mx(j+1,i)}满足(last[i]<=j < i),这里的last[i]是预处理的由i向左拓展的最远距离(也就是不含同类原子的最远距离),会T

观察一下可以发现当右端点i固定左端点j向左扫时其间b的最大值mx是不减的,这就相当于在找到下一个更大值之前mx不会变。这里维护一个递减的单调队列表示从i向左扫到那些位置会使mx发生变化。由于f是单调不减的,在mx不变时用最左边的f一定是最小值,这就相当于在单调队列中的每一项的f加上下一位的mx

由于某些神奇的原因这题暴力修改单调队列中的元素不会T,就放上来了

Code


#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)
#define drp(i, st, ed) for (int i = st; i >= ed; i -= 1)
#define erg(i, st) for (int i = ls[st]; i; i = e[i].next)
#define fill(x, t) memset(x, t, sizeof(x))
#define max(x, y) ((x)>(y)?(x):(y))
#define min(x, y) ((x)<(y)?(x):(y))
#define abs(x) ((x)<(0)?(-(x)):(x))
#define ll long long
#define ld lont double
#define db double
#define INF 0x3f3f3f3f
#define N 1000001
#define E 10001
int queue[N], last[N], a[N], b[N], f[N], pos[N];
inline int read() {int x = 0, v = 1;char ch = getchar();for (; ch < '0' || ch > '9'; v *= ((ch == '-')?(-1):(1)), ch = getchar());for (; ch <= '9' && ch >= '0'; (x *= 10) += ch - '0', ch = getchar());return x * v;
}
int main(void) {// freopen("data.in","r",stdin);// freopen("myp.out","w",stdout);int n = read();int head = 0;int tail = -1;rep(i, 1, n) {a[i] = read();b[i] = read();if (!pos[a[i]]) {pos[a[i]] = i;last[i] = 0;} else {last[i] = pos[a[i]];pos[a[i]] = i;}last[i] = max(last[i], last[i - 1]);}queue[++ tail] = 1;f[1] = b[1];rep(i, 2, n) {while (last[i] > queue[head] && head <= tail) {head += 1;}while (b[queue[tail]] <= b[i] && head <= tail) {tail -= 1;}queue[++ tail] = i;f[i] = INF;rep(j, head + 1, tail) {f[i] = min(f[queue[j - 1]] + b[queue[j]], f[i]);}f[i] = min(f[last[i]] + b[queue[head]], f[i]);}printf("%d\n", f[n]);return 0;
}

2017年10月23日提高组T2 灵知的太阳信仰 单调队列优化dp相关推荐

  1. SSL2811 2017年10月30日提高组T2 摘Galo(树形dp)

    2017年10月30日提高组T2 摘Galo Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有 ...

  2. SSL2793 2017年10月26日提高组T2 Deep(博弈)

    2017年10月26日提高组T2 Deep Description 失败的燃烧军团想要逃回深渊,Khadgar 想要追击它们. 然而进入深渊的传送门只有一座,燃烧军团和Khadgar 各有一些法力水晶 ...

  3. 【SSLGZ 2811】2017年10月30日提高组T2 摘Galo

    问题描述 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Galo,美味度为w ...

  4. 【SSLGZ 2812】2017年10月30日提高组T2 凤凰院真凶

    问题描述 输入 输出 第一行一个整数k,表示最长公共合法事件序列的长度. 样例输入 5 1 4 2 5 1 4 1 1 2 4 样例输出 2 数据范围 算法讨论 f[i][j]为a到第i个位置,b到第 ...

  5. SSL2668 2017年8月7日提高组T1 根(dfs)

    2017年8月7日提高组T1 根 Description 一天,小B得到了一棵n个节点的树.无聊至极的小B想要找出一个点,使得以这个点为根时,所有点的深度之和最大.但小B打开手机,发现他最爱的re:c ...

  6. 2020年10月30日提高组 C 大鱼吃小鱼

    文章目录 R e s u l t Result Result H y p e r l i n k Hyperlink Hyperlink D e s c r i p t i o n Descripti ...

  7. 2017年10月08日普及组 世界语

    分析 水题一道,提交的时候把文件夹的名字打错了,结果没了100分-- 程序 const a:array[1..10]of string=('unu','du','tri','kvar','kvin', ...

  8. 纪中训练5月23日提高组T1

    [USACO 2017 US Open Silver]Bovine Genomics 题解: 暴力 把ACGT对应成数字,然后记录 接着就是暴力找三个位置 然后又是暴力判断 综上所述: 暴力 #inc ...

  9. 2020年10月30日提高组 B 超级蚯蚓

    文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...

最新文章

  1. hdu 2552 三足鼎立 关于tan的数论
  2. debian虚拟机装上后开机不行_华为MT9进水不开机, 一步一个“坑”把掌柜修的也是无语,想发火...
  3. 【转】自然语言系列学习之表示学习与知识获取(八)利用远程监督多实例的关系抽取
  4. 云计算环境下的应用架构设计
  5. python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...
  6. 如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境 [转]
  7. JavaScript——文档对象模型
  8. LeetCode 723. 粉碎糖果(模拟)
  9. tomcat 系统服务 outofmemory
  10. 手机支付优惠促销活动插画素材,拿来就能用,高效省时。
  11. 使用socket实现基于select模型的网络聊天室
  12. python密码编程_Python密码学编程
  13. 推荐阅读啃饼随笔的《玩聚网的案例分析》
  14. 苹果 macOS 系统键盘快捷键列表大全整理
  15. oppo计算机找不到,oppo手机文件在电脑上无法读取怎么办
  16. android 源码导入android studio中(仿佛打开了新世界)
  17. 零知识证明(zero-knowledge proof)
  18. 未连接到互联网,检查代理服务器地址
  19. 跟涛哥一起学嵌入式 27:一个小故事,让你明白进程、线程和协程的区别
  20. Activity软盘配置

热门文章

  1. 技术面试遇到不会的问题怎么办?教你3招技巧!
  2. GLES2.0中文API-glUseProgram
  3. 使用Ilj编解码Jpeg文件
  4. 软件设计师必考精华 - 多媒体、信息安全、法律
  5. 抖音一键生成的AI绘画火了,网友惊呼:有点东西
  6. Linux运行jar包报错:Error:Invalid or corrupt jarfile xxx.jar
  7. android7.0/8.0使用第三方软件battery monitor等软件读取电池电量,显示电池容量与实际容量不符修改
  8. 2、AP上线的那些事儿(1)capwap建立过程、设备初始化以及二层上线
  9. Cisco AP 升级
  10. VS 2017 OCX