题目描述

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

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

数据范围

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

解法

动态规划;
设f[i]为在i与i+1之间切分最小代价和,那么f[n]就是答案。

f[i]=f[j]+max(a[j..i])

利用队列维护一个类似阶梯状,对于同一梯度,由于f递增,所以只需维护同一梯度最前的值。

代码

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#define ll long long
using namespace std;
const char* fin="array.in";
const char* fout="array.out";
const int maxn=100007,maxt=maxn*4;
int n,i,j,k,v,LAST,inf;
int f[maxn],a[maxn][2];
int la[maxn],last[maxn];
int c[maxt];
void change(int l,int r,int t,int v,int v1){int mid=(l+r)/2;if (l==r){c[t]=v1;return;}if (v<=mid) change(l,mid,t*2,v,v1);else change(mid+1,r,t*2+1,v,v1);c[t]=min(c[t*2],c[t*2+1]);
}
int getmin(int l,int r,int t,int v1,int v2){int mid=(l+r)/2;if (l>v2 || r<v1) return inf;if (l>=v1 && r<=v2) return c[t];return min(getmin(l,mid,t*2,v1,v2),getmin(mid+1,r,t*2+1,v1,v2));
}
struct qual{int data[maxn],id[maxn],head,tail;qual(){head=1;tail=0;}void push(int v){if (tail-head<0 || data[tail]!=0){data[++tail]=0;id[tail]=v;change(1,n,1,tail,f[v]);}}void pull(int v){while (tail-head>=0 && data[tail]<v) tail--;if (tail-head<0 || data[tail]>v){tail++;data[tail]=v;change(1,n,1,tail,f[id[tail]]+data[tail]);}}void update(int v,int v1){while (tail-head>=1 && id[head+1]<v) head++;if (tail-head>=0 && id[head]<v){id[head]=v;change(1,n,1,head,f[id[head]]+data[head]);}}int top(){return tail-head>=0?getmin(1,n,1,head,tail):inf;}
}q;
int main(){freopen(fin,"r",stdin);freopen(fout,"w",stdout);scanf("%d",&n);for (i=1;i<=n;i++){scanf("%d%d",&a[i][0],&a[i][1]);last[i]=la[a[i][0]];la[a[i][0]]=i;}memset(f,127,sizeof(f));memset(c,127,sizeof(c));inf=c[0];f[0]=0;q.push(0);for (i=1;i<=n;i++){k=0;LAST=max(LAST,last[i]);q.update(LAST,i);q.pull(a[i][1]);f[i]=q.top();q.push(i);}printf("%d",f[n]);return 0;
}

启发

这道题演绎比较显然,很快会想出动态规划。
考虑答案的贡献,结合交集优化。
同一梯度的大多状态都是冗余的。

转载于:https://www.cnblogs.com/hiweibolu/p/6714840.html

【JZOJ4883】【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰相关推荐

  1. JZOJ4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰 2017.10(B组)

    Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取 ...

  2. JZOJ4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    题目 20 40 80 100 大致流程 code 题目 Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核 ...

  3. jzoj 4883. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取 ...

  4. 【NOIP2016提高A组集训第12场11.10】灵知的太阳信仰

    Description 在炽热的核熔炉中,居住着一位少女,名为灵乌路空. 据说,从来没有人敢踏入过那个熔炉,因为人们畏缩于空所持有的力量--核能. 核焰,可融真金. 咳咳. 每次核融的时候,空都会选取 ...

  5. 【JZOJ4884】【NOIP2016提高A组集训第12场11.10】图的半径

    题目描述 mhy12345学习了树的直径,于是开始研究图的半径,具体来说,我们需要在图中选定一个地方作为中心,其中这个中心有可能在路径上. 而这个中心的选址需要能够使得所有节点达到这个中心的最短路里面 ...

  6. 【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块

    题目描述 Dpstr最近迷上了推冰块.冰地是一个n行m列的网格区域,第i行第j列的格子记为(i,j),也就是左上角为(1,1),右下角为(n,m).每个格子可能是冰面.障碍物.减速带三者之一.其中,冰 ...

  7. 【JZOJ4896】【NOIP2016提高A组集训第16场11.15】兔子

    题目描述 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3条或更多的路径与它相连,其它的兔子窝只有1条或2条路径与其相连.换句话讲,这些兔子窝之 ...

  8. JZOJ4870. 【NOIP2016提高A组集训第9场11.7】涂色游戏

    Description Data Constraint Solution 我们设f[i][j]表示当前有i个格子恰好放了j种颜色的方案数,那么f[i][j]=f[i−1][j−1]∗(p−(j−1)) ...

  9. 【NOIP2016提高A组集训第7场11.4】推冰块

    Description Dpstr最近迷上了推冰块.冰地是一个n行m列的网格区域,第i行第j列的格子记为(i,j),也就是左上角为(1,1),右下角为(n,m).每个格子可能是冰面.障碍物.减速带三者 ...

最新文章

  1. vue的html自动刷新,Vue页面刷新记住页面状态的实现
  2. error: unpacking of archive failed on file错误的解决
  3. dockerfile 创建Jenkins镜像
  4. python将时间戳转化为标准时间格式的方法
  5. 解决Macbook网络连接成功但是图标一直显示正在查找网络问题
  6. Centos-Nginx-Docker 入门(一)
  7. 项目经理案头手册学习系列【18】——社会技术系统和项目组织
  8. 代码审查工具 FindBugs
  9. 用matlab实现灰色预测gm11模型,用MATLAB实现灰色预测GM11模型
  10. Leetcode 995. Minimum Number of K Consecutive Bit Flips
  11. 手把手教你开一间咖啡馆
  12. 情感读本杂志情感读本杂志社情感读本编辑部2022年第23期目录
  13. Python网络爬虫开发实战,ADSL 拨号代理
  14. STM32F103ZET6【标准库函数开发】----- 04串口4的IO口收发数据实验测试
  15. 基于51单片机霍尔汽车自行车码表测速测里程显示proteus仿真原理图PCB
  16. Gary Marcus:因果熵理论的荒诞和认知科学带给AI的11个启示 | 文末赠书
  17. Android默认头像那些事儿
  18. 如何下载微信公众号中的音频、视频文件?
  19. .dwg(sw)-exb
  20. 布法罗博士计算机专业回国人员,2020年纽约州立大学布法罗分校博士专业设置...

热门文章

  1. 带你了解一下PHP搭建的电商商城系统
  2. GLES2.0中文API-glBindAttribLocation
  3. 9.10 安卓常用工具类之一 对话 ---- DialogUtil
  4. [go]Go语言编译器的 “//go:“ 详解
  5. ACM: 百练NOI——基本算法之动态规划
  6. 计算机组成原理的重难点,《计算机组成原理》重点难点习题
  7. 微信小程序与蓝牙模块通信注意事项
  8. htc 8x android,HTC 8X三款手机曝光:相机是重点 不支持SD卡
  9. 华为计算机apk,华为手机助手安卓版apk
  10. Bellhop-水平海底计算案例