P2300 合并神犇

题目背景

loidc来到了NOI的赛场上,他在那里看到了好多神犇。

题目描述

神犇们现在正排成一排在刷题。每个神犇都有一个能力值p[i]。loidc认为坐在附近的金牌爷能力参差不齐非常难受。于是loidc便想方设法对神犇们进行人道主义合并。

loidc想把神犇的能力值排列成从左到右单调不减。他每次可以选择一个神犇,把他合并到两侧相邻的神犇上。合并后的新神犇能力值是以前两位犇的能力值之和。每次合并完成后,被合并的两个神犇就会消失。合并后的新神犇不能再分开(万一他俩有女朋友咋办)因此每次合并后神犇的总数会减1.

loidc想知道,想治好他的强迫症需要合并多少次

输入输出格式

输入格式:

第一行一个整数 n。

第二行 n 个整数,第 i 个整数表示 p[i]。

输出格式:

loidc需要合并的次数

说明

对于 50%的数据,0< n <=5000。

对于 100%的数据,0< n <=200000,0< p[i] <=2147483647,p 均为随机生成。


暴力数据结构万岁!!!

有一个纯贪心做法,详见大佬的博客

这里我们用暴力数据结构维护。

不难想到转移方程:
令\(dp[i]\)代表前\(i\)个人合并后的最小合并次数,\(f[i]\)代表前\(i\)个人在最小合并下的末尾元素,\(sum[i]\)为前缀和数组。

值得一提的是,这里有个贪心:即\(f[i]\)在\(dp[i]\)下一定取到最小。

转移:\(dp[i]=dp[k]+i-1-k,f[k]<=sum[i]-sum[k]\)

枚举\(k\)的话是\(O(n^2)\),这里搞个暴力数据结构维护一下。

将转移条件变形,\(sum[k]+f[k]<=sum[i]\),也就是说,我们每次询问值比\(sum[i]\)小的区间所代表的转移中的最小值即可。

在线段树上维护二元组\((dp[k]+n-k,k)\),第一组为第一关键字,求最小值,第二组为第二关键字,求最大值。

为什么求最大值?一个贪心,当\(dp[k]+n-k\)相等时,\(k\)越往后取,\(f[i]\)越小(或不变)。

然而区间可能开的很大,我们得想办法优化一下空间。

参照主席树的思想进行离散,我们可以对用不上的区间先不管,询问时或者改变时再加上即可。


code:

#include <cstdio>
#define LS t[id].ls
#define RS t[id].rs
#define Mid (ql+qr>>1)
typedef long long ll;
const int N=200010;
ll a[N],s[N],f[N];
int n,dp[N],root;
//dp[i]长度为i的合法序列最小合并
//f[i]长度为i的合法序列最小合并下的末尾最小大小
struct node2
{int c,pos;bool friend operator <(node2 n1,node2 n2){if(n1.c!=n2.c) return n1.c<n2.c;return n1.pos>n2.pos;}
}inf;
node2 min(node2 x,node2 y){return x<y?x:y;}
struct node
{int ls,rs;//子树node2 c;
}t[30000002];//维护值在l,r区间内的最小dp[k]+n-k;
int tot=0,pos[N];
int add(ll l,ll r,node2 x)
{t[++tot].c=x;return tot;
}
node2 query(int id,ll ql,ll qr,ll l,ll r)
{if(!id) return inf;if(l==ql&&r==qr)return t[id].c;if(r<=Mid) return query(LS,ql,Mid,l,r);else if(l>Mid) return query(RS,Mid+1,qr,l,r);else return min(query(LS,ql,Mid,l,Mid),query(RS,Mid+1,qr,Mid+1,r));
}
int change(int id,ll ql,ll qr,ll x,node2 del)
{if(!id) id=add(ql,qr,del);if(ql==qr) return id;if(Mid>=x) LS=change(LS,ql,Mid,x,del);else RS=change(RS,Mid+1,qr,x,del);t[id].c=min(t[id].c,del);return id;
}
int main()
{scanf("%d",&n);inf.c=0x3f3f3f3f;inf.pos=0x3f3f3f3f;for(int i=1;i<=n;i++){scanf("%lld",a+i);s[i]=s[i-1]+a[i];}node2 cc;cc.c=n,cc.pos=0;root=add(0,s[n],cc);change(root,0,s[n],0,cc);pos[n]=0;for(int i=1;i<=n;i++){node2 j=query(1,0,s[n],0,s[i]);dp[i]=j.c-1+i-n;f[i]=s[i]-s[j.pos];if(s[i]+f[i]<=s[n]){node2 tt;tt.c=dp[i]+n-i;tt.pos=i;change(root,0,s[n],s[i]+f[i],tt);}}printf("%d\n",dp[n]);return 0;
}

2018.6.8

转载于:https://www.cnblogs.com/butterflydew/p/9157896.html

洛谷 P2300 合并神犇 解题报告相关推荐

  1. 【洛谷】P4147 玉蟾宫 解题报告

    [洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...

  2. P2300 合并神犇(单调队列优化dp)

    P2300 合并神犇(单调队列优化dp) 令fif_ifi​​表示前iii​个数的最少合并次数,gig_igi​​表示在fif_ifi​​条件下的最小结尾值. 有转移方程:fi=min(fj+i−j− ...

  3. P2300 合并神犇 DP

    题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loi ...

  4. 洛谷 CF1043F Make It One 解题报告

    CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...

  5. 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告

    P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...

  6. 洛谷 P2389 电脑班的裁员 解题报告

    题意: 给定一段长为N的序列,选取其中的至多M段使这些子段和最大. 当N=1000时,我们可以采用动态规划解法 令\(dp[i][j][k]\)代表当前选至位置\(i\)处于第\(j\)段当前是否选取 ...

  7. 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告

    P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...

  8. 「洛谷P1343」地震逃生 解题报告

    P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...

  9. 洛谷 P4284 [SHOI2014]概率充电器 解题报告

    P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...

最新文章

  1. 烟台大学计算机课本,操作系统指导书-烟台大学计算机学院.doc
  2. 阿里达摩院青橙奖颁出:10名85后每人100万!其中有硬核粉红少女,还有人被LeCun点名支持...
  3. golang go mod包管理自定义包及init初始化函数介绍
  4. 转一个后缀数组的简单总结:
  5. 【sqlserver】在没有数据库备份的情况下,获得操作记录信息【code】
  6. java 打开sql数据库_idea 使用Java连接SQL Server数据库教程
  7. Morphia - mongodb之ORM框架
  8. (转ORCLE导入导出命令)
  9. krpano使用总结-地图路线
  10. 【ES】es 冻结的索引如何查询
  11. SVN commit failed: 'xxx' is not under version control
  12. 网页素材精品:一组五彩缤纷的免费矢量背景素材
  13. 大数据环境下数据质量指标体系
  14. stm32单片机驱动L298N模块
  15. 数据恢复基础和进阶教程(二)
  16. C语言——恶搞关机小程序
  17. 大地坐标与空间直角坐标系的相互转化
  18. 【TVM 巡礼】How to optimize cpu(x86) gemm串讲
  19. 基于 shell 的自动邮件任务监测器
  20. 快速学习编程语言,快速高效的入门

热门文章

  1. centos7 数图转换
  2. 线序检测视觉算设计过程及效果展示
  3. Yii2.0 后台UI框架以及权限管理扩展实现权限菜单管理
  4. 北京中信银行总行地址_中信银行地址
  5. linux使用rdesktop-vrdp进行远程连接
  6. MATLAB中颜色和线条对应的标识符
  7. 鸟哥linux学习途中感言-误删除/bin目录
  8. ISCA2011第二篇文献:Virtualizing Performance Asymmetric Multi-core Systems
  9. 无源滤波器和有源滤波器的区别
  10. 安利 10 个让你爽到爆的 IDEA 必备插件!