题目链接: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. git log 详解 以及代码量统计

    https://git-scm.com/book/zh/v1/Git-%E5%9F%BA%E7%A1%80-%E6%9F%A5%E7%9C%8B%E6%8F%90%E4%BA%A4%E5%8E%86% ...

  2. Django【第3篇】:Django之模板语法

    Django框架之第三篇模板语法(重要!!!) 一.什么是模板? 只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板. 二.模板语法分类 一.模板语法之变量:语法为 {{ }}: ...

  3. ZROI 19.07.28 组合计数/lb

    T1 题意:\(n\)个变量,\(0 \leq x_i \leq c_i\),求\(\sum x_i = A\)方案数.\(n \leq 32\). Sol: \(n \leq 10\)的时候容斥很水 ...

  4. 触发器insert

    USE [stalentzx]GO/****** Object: Trigger [dbo].[GZ_HISTORY_INSERT] Script Date: 2019/12/24 13:11:40 ...

  5. spring boot mapper层传参数是用main的arg0(第一个参数),arg1(第二个参数)

    spring boot mapper层传参数是用main的arg0(第一个参数),arg1(第二个参数) 大于三个参数,用map传递 public interface FrontMapper{ //= ...

  6. webpack配置反向代理

    devServer: { contentBase: path.resolve(__dirname, "../dev"), compress: true, port: ,//本身的端 ...

  7. idea上把项目推送到GitHub上

  8. CF1051F The Shortest Statement Dijkstra + 性质分析

    动态询问连通图任意两点间最短路,单次询问. 显然,肯定有一些巧妙地性质(不然你就发明了新的最短路算法了233)有一点很奇怪:边数最多只比点数多 $20$ 个,那么就可以将这个图看作是一个生成树,上面连 ...

  9. CityMaker SDK与三维GIS城市

    https://wenku.baidu.com/view/abc2a32f01f69e3142329426.html https://blog.csdn.net/weixin_38476447/art ...

  10. [CSP-S模拟测试]:矩阵游戏(数学)

    题目描述 $LZK$发明一个矩阵游戏,大家一起来玩玩吧,有一个$N$行$M$列的矩阵.第一行的数字是$1,2,...,M$,第二行的数字是$M+1,M+2,...,2\times M$,以此类推,第$ ...