洛谷 P2300 合并神犇 解题报告
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 合并神犇 解题报告相关推荐
- 【洛谷】P4147 玉蟾宫 解题报告
[洛谷]P4147 玉蟾宫 解题报告 题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N* ...
- P2300 合并神犇(单调队列优化dp)
P2300 合并神犇(单调队列优化dp) 令fif_ifi表示前iii个数的最少合并次数,gig_igi表示在fif_ifi条件下的最小结尾值. 有转移方程:fi=min(fj+i−j− ...
- P2300 合并神犇 DP
题目背景 loidc来到了NOI的赛场上,他在那里看到了好多神犇. 题目描述 神犇们现在正排成一排在刷题.每个神犇都有一个能力值p[i].loidc认为坐在附近的金牌爷能力参差不齐非常难受.于是loi ...
- 洛谷 CF1043F Make It One 解题报告
CF1043F Make It One 题意 从一堆数中选择最少的数,使它们的\(\gcd=1\) 输入输出格式 输入格式 第一行:一个正整数\(n\). 第二行:\(n\)个正整数,给出了这个数列. ...
- 洛谷 P3521 [POI2011]ROT-Tree Rotations 解题报告
P3521 [POI2011]ROT-Tree Rotations 题意:递归给出给一棵\(n(1≤n≤200000)\)个叶子的二叉树,可以交换每个点的左右子树,要求前序遍历叶子的逆序对最少. 大体 ...
- 洛谷 P2389 电脑班的裁员 解题报告
题意: 给定一段长为N的序列,选取其中的至多M段使这些子段和最大. 当N=1000时,我们可以采用动态规划解法 令\(dp[i][j][k]\)代表当前选至位置\(i\)处于第\(j\)段当前是否选取 ...
- 洛谷 P3539 [POI2012]ROZ-Fibonacci Representation 解题报告
P3539 [POI2012]ROZ-Fibonacci Representation 题意:给一个数,问最少可以用几个斐波那契数加加减减凑出来 多组数据10 数据范围1e17 第一次瞬间yy出做法, ...
- 「洛谷P1343」地震逃生 解题报告
P1343 地震逃生 题目描述 汶川地震发生时,四川XX中学正在上课,一看地震发生,老师们立刻带领x名学生逃跑,整个学校可以抽象地看成一个有向图,图中有n个点,m条边.1号点为教室,n号点为安全地带, ...
- 洛谷 P4284 [SHOI2014]概率充电器 解题报告
P4284 [SHOI2014]概率充电器 题目描述 著名的电子产品品牌SHOI 刚刚发布了引领世界潮流的下一代电子产品-- 概率充电器: "采用全新纳米级加工技术,实现元件与导线能否通电完 ...
最新文章
- 烟台大学计算机课本,操作系统指导书-烟台大学计算机学院.doc
- 阿里达摩院青橙奖颁出:10名85后每人100万!其中有硬核粉红少女,还有人被LeCun点名支持...
- golang go mod包管理自定义包及init初始化函数介绍
- 转一个后缀数组的简单总结:
- 【sqlserver】在没有数据库备份的情况下,获得操作记录信息【code】
- java 打开sql数据库_idea 使用Java连接SQL Server数据库教程
- Morphia - mongodb之ORM框架
- (转ORCLE导入导出命令)
- krpano使用总结-地图路线
- 【ES】es 冻结的索引如何查询
- SVN commit failed: 'xxx' is not under version control
- 网页素材精品:一组五彩缤纷的免费矢量背景素材
- 大数据环境下数据质量指标体系
- stm32单片机驱动L298N模块
- 数据恢复基础和进阶教程(二)
- C语言——恶搞关机小程序
- 大地坐标与空间直角坐标系的相互转化
- 【TVM 巡礼】How to optimize cpu(x86) gemm串讲
- 基于 shell 的自动邮件任务监测器
- 快速学习编程语言,快速高效的入门