2017年10月23日提高组T2 灵知的太阳信仰 单调队列优化dp
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相关推荐
- SSL2811 2017年10月30日提高组T2 摘Galo(树形dp)
2017年10月30日提高组T2 摘Galo Description 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有 ...
- SSL2793 2017年10月26日提高组T2 Deep(博弈)
2017年10月26日提高组T2 Deep Description 失败的燃烧军团想要逃回深渊,Khadgar 想要追击它们. 然而进入深渊的传送门只有一座,燃烧军团和Khadgar 各有一些法力水晶 ...
- 【SSLGZ 2811】2017年10月30日提高组T2 摘Galo
问题描述 0v0在野外看到了一棵Galo树,看到食物的0v0瞪大了眼睛,变成了OvO. 这棵Galo树可以看做是一棵以1号点为根的n个点的有根数,除了根节点以外,每个节点i都有一个Galo,美味度为w ...
- 【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到第 ...
- SSL2668 2017年8月7日提高组T1 根(dfs)
2017年8月7日提高组T1 根 Description 一天,小B得到了一棵n个节点的树.无聊至极的小B想要找出一个点,使得以这个点为根时,所有点的深度之和最大.但小B打开手机,发现他最爱的re:c ...
- 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 ...
- 2017年10月08日普及组 世界语
分析 水题一道,提交的时候把文件夹的名字打错了,结果没了100分-- 程序 const a:array[1..10]of string=('unu','du','tri','kvar','kvin', ...
- 纪中训练5月23日提高组T1
[USACO 2017 US Open Silver]Bovine Genomics 题解: 暴力 把ACGT对应成数字,然后记录 接着就是暴力找三个位置 然后又是暴力判断 综上所述: 暴力 #inc ...
- 2020年10月30日提高组 B 超级蚯蚓
文章目录 ResultResultResult HyperlinkHyperlinkHyperlink DescriptionDescriptionDescription SolutionSoluti ...
最新文章
- hdu 2552 三足鼎立 关于tan的数论
- debian虚拟机装上后开机不行_华为MT9进水不开机, 一步一个“坑”把掌柜修的也是无语,想发火...
- 【转】自然语言系列学习之表示学习与知识获取(八)利用远程监督多实例的关系抽取
- 云计算环境下的应用架构设计
- python倒排索引实现_倒排索引原理和实现 - uncle_LLD的个人空间 - OSCHINA - 中文开源技术交流社区...
- 如何搭建lamp(CentOS7+Apache+MySQL+PHP)环境 [转]
- JavaScript——文档对象模型
- LeetCode 723. 粉碎糖果(模拟)
- tomcat 系统服务 outofmemory
- 手机支付优惠促销活动插画素材,拿来就能用,高效省时。
- 使用socket实现基于select模型的网络聊天室
- python密码编程_Python密码学编程
- 推荐阅读啃饼随笔的《玩聚网的案例分析》
- 苹果 macOS 系统键盘快捷键列表大全整理
- oppo计算机找不到,oppo手机文件在电脑上无法读取怎么办
- android 源码导入android studio中(仿佛打开了新世界)
- 零知识证明(zero-knowledge proof)
- 未连接到互联网,检查代理服务器地址
- 跟涛哥一起学嵌入式 27:一个小故事,让你明白进程、线程和协程的区别
- Activity软盘配置
热门文章
- 技术面试遇到不会的问题怎么办?教你3招技巧!
- GLES2.0中文API-glUseProgram
- 使用Ilj编解码Jpeg文件
- 软件设计师必考精华 - 多媒体、信息安全、法律
- 抖音一键生成的AI绘画火了,网友惊呼:有点东西
- Linux运行jar包报错:Error:Invalid or corrupt jarfile xxx.jar
- android7.0/8.0使用第三方软件battery monitor等软件读取电池电量,显示电池容量与实际容量不符修改
- 2、AP上线的那些事儿(1)capwap建立过程、设备初始化以及二层上线
- Cisco AP 升级
- VS 2017 OCX