题意:给定一个长为n的数组,要求挑它前缀的一段,将其分成k段,使得每段和的最大值最小

1<=k<=n<=2e5,abs(a[i])<=1e9

思路:

刚开始写了线段树TLE

改维护后缀的BIT也TLE

暴力sort改归并排序才卡过去

怀疑用map离散化不靠谱

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 400010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
ll INF=1e10;
ll inf=5e13;
int dx[]={-,,,};
int dy[]={,,-,}; map<ll,int> mp;
int t[N],n,k,id;
ll s[M],a[M],b[M],c[N]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void update(int x,int y)
{
while(x)
{
t[x]=max(t[x],y);
x-=lowbit(x);
}
} int query(int x)
{
int res=-2e6;
while(x<=id)
{
res=max(res,t[x]);
x+=lowbit(x);
}
return res;
} int isok(ll mid)
{
mp.clear();
int m=;
rep(i,,n+) b[i]=a[i]-mid;
int i=,j=;
while(i<=n+&&j<=n+)
{
m++;
if(a[i]<b[j])
{
c[m]=a[i];
i++;
}
else
{
c[m]=b[j];
j++;
}
}
while(i<=n+)
{
c[++m]=a[i];
i++;
}
while(j<=n+)
{
c[++m]=b[j];
j++;
}
id=;
mp[c[]]=;
rep(i,,m)
if(c[i]!=c[i-]) mp[c[i]]=++id;
rep(i,,id) t[i]=-2e6;
update(mp[],);
int ans=,flag=;
rep(i,,n)
{
int tmp=query(mp[s[i]-mid]);
ans=max(ans,tmp+);
if(ans>=k) return ;
update(mp[s[i]],tmp+);
}
return ;
} int main()
{
int cas=read();
while(cas--)
{
n=read(),k=read();
s[]=;
rep(i,,n)
{
int x=read();
s[i]=s[i-]+x;
}
rep(i,,n+) a[i]=s[i-];
sort(a+,a+n++);
ll l=-1e10,r=1e10,last=1e10;
while(l<=r)
{
ll mid=(l+r)>>;
if(isok(mid)){last=mid; r=mid-;}
else l=mid+;
}
printf("%I64d\n",last);
} return ;
}

【HDOJ6606】Distribution of books(二分,BIT)的更多相关文章

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

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

  2. 2019HDU多校第三场 Distribution of books 二分 + DP

    题意:给你一个序列,你可以选择序列的一个前缀,把前缀分成k个连续的部分,要求这k个部分的区间和的最大值尽量的小,问这个最小的最大值是多少? 思路:首先看到最大值的最小值,容易想到二分.对于每个二分值m ...

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

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

  4. UVA 714 Copying Books 二分

    题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...

  5. ZOJ 2002 Copying Books 二分 贪心

    传送门:Zoj2002 题目大意:从左到右把一排数字k分,得到最小化最大份,如果有多组解,左边的尽量小. 思路:贪心+二分(参考青蛙过河). 方向:从右向左. 注意:有可能最小化时不够k分.如     ...

  6. UVa 714 Copying Books - 二分答案

    求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...

  7. Gym 100425A Luggage Distribution (组合数学,二分)

    一开始想着球盒模型,数据范围大,递推会GG. 用凑的方法来算方案.往n个小球之间插两个隔板,方案是(n-1)*(n-2)/2,不区分盒子,三个盒子小球数各不相同的方案数被算了6次(做排列), 两个相同 ...

  8. [2019杭电多校第三场][hdu6606]Distribution of books(线段树&&dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 题意为在n个数中选m(自选)个数,然后把m个数分成k块,使得每块数字之和最大的最小. 求数字和最 ...

  9. HDU校赛 | 2019 Multi-University Training Contest 3

    2019 Multi-University Training Contest 3 http://acm.hdu.edu.cn/contests/contest_show.php?cid=850 100 ...

随机推荐

  1. Linux实用技巧--隧道

    平时开发过程中,可能会遇到一些网络问题,比如npm install 一些依赖包.本地电脑是可以,没有问题.但是测试环境服务器,由于公司内部网络安全限制,不可以随意访问外部网络.因此下载一个依赖包就变得 ...

  2. 网易新闻实战 --- flask,ORM, Ajax异步删除

    项目概述: 包含功能: 前端-- 新闻首页 新闻分类页 新闻详情页 后端-- 后台新闻管理(列表,分页) 新增新闻 修改新闻 删除新闻(AJAX)

  3. Shell生成随机密码

    #tr参数 -c或——complerment:取代所有不属于第一字符集的字符: -d或——delete:删除所有属于第一字符集的字符: 1.生成10个小写字母 [root@kafka60 shell] ...

  4. 什么是SpringMvc

    1.什么是SpringMvc? SpringMvc是spring的一个模块 基于MVC的一个框架 无需中间整合层来整合 什么是MVC ?mvc在b/s下的应用: 首先请求发送request请求到C(c ...

  5. [Codeforces 464E] The Classic Problem(可持久化线段树)

    [Codeforces 464E] The Classic Problem(可持久化线段树) 题面 给出一个带权无向图,每条边的边权是\(2^{x_i}(x_i<10^5)\),求s到t的最短路 ...

  6. Django读写分离

    多数据库配置 数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join ...

  7. 10、numpy——位运算

    NumPy 位运算 NumPy "bitwise_" 开头的函数是位运算函数. NumPy 位运算包括以下几个函数: 函数 描述 bitwise_and 对数组元素执行位与操作 b ...

  8. 33.Jump Game(跳步游戏)

    Level:   Medium 题目描述: Given an array of non-negative integers, you are initially positioned at the f ...

  9. Freeswitch Tutorial

    I. Install Freeswitch 1) FreeSWITCH Explained https://freeswitch.org/confluence/ https://freeswitch. ...

  10. centos 7 命令界面与GUI界面切换

    一.需要重启生效 1. 命令模式     systemctl set-default multi-user.target 2. 图形模式     systemctl set-default graph ...