题目描述

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

咳咳。
每次核融的时候,空都会选取一些原子,排成一列。然后,她会将原子序列分成一些段,并将每段进行一次核融。
一个原子有两个属性:质子数和中子数。
每一段需要满足以下条件:
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. 双非山东科技胜过吉大,湖南大学超哈工大,US News2022世界大学排行榜引热议...
  2. 2009江民中国大陆地区计算机网络安全报告
  3. BZOJ3709: [PA2014]Bohater
  4. 本地安装gem install --local redis-stat-0.4.13.gem
  5. aftool提示15天未更新_微信版本更新至7.0.15 视频号新增3种功能
  6. jsp面试问题_JSP面试问答
  7. python爬虫html、parser_利用python HTMLParser标准库实现一个简单的爬虫
  8. C# 创建PPT图表
  9. 292 炮兵阵地(状态压缩dp)
  10. java 省市联动_Java 地区字典之省市区三级联动 (一)
  11. 21年秋招面试题(个人面试小记一)
  12. DQL、DML、DDL、DCL全称及含义
  13. CorelDRAW x8警告您所用的软件疑似非法盗版软件,软件功能3天内将被永久停用,解决方法教程
  14. 概率论 —— 相关分布以及期望方差的求法汇总
  15. Martin Fowler:持续集成(很有参考意义)
  16. Kafka 3.0 源码笔记(3)-Kafka 消费者的核心流程源码分析
  17. 数据库快速入门教程--视频
  18. snmp协议简单命令
  19. [摘录]高效人士七习惯—自我管理原则
  20. python游戏编程网课_Python菜鸟快乐游戏编程_pygame(1)

热门文章

  1. 微擎安装遇到一个问题,大佬救救我
  2. 解决react项目启动invalid host header问题
  3. Java多线程案例——单例模式(恶汉模式和懒汉模式)
  4. Java中统计字符个数
  5. uni-app swiper实现公告栏上下循环滚动(整理)
  6. IOS 文本操作笔记——CHARACTERSET
  7. 分享一个开源的QT的串口示波器
  8. 示波器探头基础入门指南
  9. 平步青云:Windows Azure(二)
  10. TheFourthJavaText