题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606

题意为在n个数中选m(自选)个数,然后把m个数分成k块,使得每块数字之和最大的最小。

求数字和最大的最小一般都是二分,二分后可以dp来判断合法,dp[i]表示第i个数字最大可以在的块数。则$dp[i]=max(dp[j])+1,{sum[i]-sum[j]<=x}$,sum为前缀和,x为二分的值。

但是这样的复杂度O(n2logn),显然不行。

则可以优化一下dp,dp的合法转移条件是sum[i]-sum[j]<=x,移项为sum[j]>=sum[i]-x。所以将前缀和离散化,然后每次在权值线段树上查询大于等于sum[i]-x的位置的最大值,即是每次转移的最优位置。

然后用答案更新sum[i]位置的权值即可。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#define lson l,mid,i<<1
#define rson mid+1,r,i<<1|1
using namespace std;
typedef long long ll;
const ll maxn = 2e5 + ;
const ll inf = 1e18;
ll Max[maxn * ];
ll a[maxn], b[maxn];
void up(ll i) {
Max[i] = max(Max[i << ], Max[i << | ]);
}
void build(ll l, ll r, ll i) {
Max[i] = -inf;
if (l == r)
return;
ll mid = l + r >> ;
build(lson);
build(rson);
}
void update(ll pos, ll val, ll l, ll r, ll i) {
if (l == r) {
Max[i] = val;
return;
}
ll mid = l + r >> ;
if (pos <= mid)update(pos, val, lson);
else update(pos, val, rson);
up(i);
}
ll query(ll L, ll R, ll l, ll r, ll i) {
if (L > R)return -inf;
if (L <= l && r <= R)
return Max[i];
ll ans = -inf;
ll mid = l + r >> ;
if (L <= mid)ans = max(ans, query(L, R, lson));
if (R > mid)ans = max(ans, query(L, R, rson));
return ans;
}
ll n, k;
ll dp[maxn];
bool check(ll x, ll len) {
build(, len, );
for (ll i = ; i <= n; i++) {
ll pos = lower_bound(b + , b + + len, a[i] - x) - b;
ll pos2 = lower_bound(b + , b + + len, a[i]) - b;
dp[i] = query(pos, len, , len, ) + ;
if (a[i] <= x)
dp[i] = max(dp[i], 1ll);
if (dp[i] >= k)
return true;
if (dp[i] > )
update(pos2, dp[i], , len, );
}
return false;
}
int main() {
int t;
scanf("%d", &t);
while (t--) {
ll x;
scanf("%lld%lld", &n, &k);
for (ll i = ; i <= n; i++)
scanf("%lld", &x), a[i] = a[i - ] + x, b[i] = a[i];
sort(b + , b + + n);
ll len = unique(b + , b + + n) - b - ;
ll l = -inf, r = inf, ans;
while (l <= r) {
ll mid = l + r >> ;
if (check(mid, len)) {
ans = mid;
r = mid - ;
}
else
l = mid + ;
}
printf("%lld\n", ans);
}
}

[2019杭电多校第三场][hdu6606]Distribution of books(线段树&&dp)的更多相关文章

  1. 2019杭电多校第三场hdu6606 Distribution of books(二分答案+dp+权值线段树)

    Distribution of books 题目传送门 解题思路 求最大值的最小值,可以想到用二分答案. 对于二分出的每个mid,要找到是否存在前缀可以份为小于等于mid的k份.先求出这n个数的前缀和 ...

  2. [2019杭电多校第三场][hdu6609]Find the answer(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6609 大致题意是求出每个位置i最小需要将几个位置j变为0(j<i),使得$\sum_{j=1}^ ...

  3. 2019杭电多校第三场hdu6609 Find the answer(线段树)

    Find the answer 题目传送门 解题思路 要想变0的个数最少,显然是优先把大的变成0.所以离散化,建立一颗权值线段树,维护区间和与区间元素数量,假设至少减去k才能满足条件,查询大于等于k的 ...

  4. HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP

    Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...

  5. [2019杭电多校第三场][hdu6608]Fansblog

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6608 大致题意是比p小的最大素数q,求q!%p的值. 由威尔逊定理开始推: $(p-1)!\equiv ...

  6. 2019杭电多校第三场hdu6608 Fansblog(威尔逊定理)

    Fansblog 题目传送门 解题思路 Q! % P = (P-1)!/(P-1)...(Q-1) % P. 因为P是质数,根据威尔逊定理,(P-1)!%P=P-1.所以答案就是(P-1)((P-1) ...

  7. 2019牛客多校第八场 F题 Flowers 计算几何+线段树

    2019牛客多校第八场 F题 Flowers 先枚举出三角形内部的点D. 下面所说的旋转没有指明逆时针还是顺时针则是指逆时针旋转. 固定内部点的答案的获取 anti(A)anti(A)anti(A)或 ...

  8. 2019年杭电多校第三场 1011题Squrirrel(HDU6613+树DP)

    题目链接 传送门 题意 给你一棵无根树,要你寻找一个根节点使得在将一条边权变为\(0\)后,离树根最远的点到根节点的距离最小. 思路 本题和求树的直径很像,不过要记得的东西有点多,且状态也很多. \( ...

  9. 2019年杭电多校第三场 1008题Game(HDU6610+带修改莫队+Nim博弈)

    题目链接 传送门 题意 给你\(n\)堆石子,每堆有\(a_i\)堆石子,\(q\)次操作: 在\([L,R]\)内有多少个子区间使得\(Alice\)(先手)在\(Nim\)博弈中获胜: 交换\(a ...

随机推荐

  1. 安装了sql-alchemy但导入sql_alchemy时失败

    问题描述:按成flask-sqlalchemy成功了,但是项目导入flask_alchemy时出错 但是,发现在代码中还是导入不了 之后发现问题,到file->setting->proje ...

  2. USB-TTL

  3. 【NOIP2016提高A组模拟8.14】传送带

    题目 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.FTD在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在FTD想从A点走 ...

  4. SPOJ 2798 QTREE3 - Query on a tree again!

    原oj题面 Time limit 2000 ms Memory limit 1572864 kB Code length Limit 50000 B OS Linux Language limit A ...

  5. Qt中图元对象的多重集成

    在继承自定义QGraphicsItem图元对象时,有时需要用到信号/槽机制,由于QGraphicsItem非QObject的子类 所以需要多重继承QObject,有一点需要特别注意:就是继承的顺序,一 ...

  6. bytesToSize

    export function bytesToSize(bytes){ if (bytes === 0) return '0 B' let k = 1024, // or 1000 sizes = [ ...

  7. 《SQL Server 2012 T-SQL基础》读书笔记 - 3.联接查询

    Chapter 3 Joins Cross Joins(交叉联接)就是返回两个表的笛卡尔积(m行的表cross join一个n行的表得到一个m * n行的结果),它有两种标准SQL语法,第一种: SE ...

  8. fedora18 [linux]Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more mirrors to try.

    在使用fedora17 系统的yum源的时候出现了如下错误: Error: failure: repodata/repomd.xml from fedora: [Errno 256] No more ...

  9. Ffmpeg AAC 编码错误 Input contains (near) NaN/+-Inf

    Ffmpeg AAC编码 如果传入参Frame的Sample Format 为 AV_SAMPLE_FMT_S16,会出现 错误提示 Input contains (near) NaN/+-Inf,需 ...

  10. IIS 配置备份和还原

    首先我们打开服务器管理器,一般服务器都在左下角的任务栏中,直接点击即可打开 图1 打开WEB服务器(IIS),选择IIS根目录,找到右边的共享管理 图2 打开共享管理后,我们在右侧的操作中找到导出配置 ...