【HDOJ6606】Distribution of books(二分,BIT)
题意:给定一个长为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)的更多相关文章
- 2019杭电多校第三场hdu6606 Distribution of books(二分答案+dp+权值线段树)
		
Distribution of books 题目传送门 解题思路 求最大值的最小值,可以想到用二分答案. 对于二分出的每个mid,要找到是否存在前缀可以份为小于等于mid的k份.先求出这n个数的前缀和 ...
 - 2019HDU多校第三场 Distribution of books 二分 + DP
		
题意:给你一个序列,你可以选择序列的一个前缀,把前缀分成k个连续的部分,要求这k个部分的区间和的最大值尽量的小,问这个最小的最大值是多少? 思路:首先看到最大值的最小值,容易想到二分.对于每个二分值m ...
 - HDU多校第三场 Hdu6606 Distribution of books 线段树优化DP
		
Hdu6606 Distribution of books 题意 把一段连续的数字分成k段,不能有空段且段和段之间不能有间隔,但是可以舍去一部分后缀数字,求\(min(max((\sum ai ))\ ...
 - UVA 714 Copying Books 二分
		
题目链接: 题目 Copying Books Time limit: 3.000 seconds 问题描述 Before the invention of book-printing, it was ...
 - ZOJ 2002 Copying Books 二分 贪心
		
传送门:Zoj2002 题目大意:从左到右把一排数字k分,得到最小化最大份,如果有多组解,左边的尽量小. 思路:贪心+二分(参考青蛙过河). 方向:从右向左. 注意:有可能最小化时不够k分.如 ...
 - UVa 714 Copying Books - 二分答案
		
求使最大值最小,可以想到二分答案. 然后再根据题目意思乱搞一下,按要求输出斜杠(这道题觉得就这一个地方难). Code /** * UVa * Problem#12627 * Accepted * T ...
 - Gym 100425A 	Luggage Distribution  (组合数学,二分)
		
一开始想着球盒模型,数据范围大,递推会GG. 用凑的方法来算方案.往n个小球之间插两个隔板,方案是(n-1)*(n-2)/2,不区分盒子,三个盒子小球数各不相同的方案数被算了6次(做排列), 两个相同 ...
 - [2019杭电多校第三场][hdu6606]Distribution of books(线段树&&dp)
		
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6606 题意为在n个数中选m(自选)个数,然后把m个数分成k块,使得每块数字之和最大的最小. 求数字和最 ...
 - 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 ...
 
随机推荐
- Node.js - 使用 Express 和 http-proxy 进行反向代理
			
安装 Express 和 http-proxy npm install --save express http-proxy 反向代理代码 proxy.js var express = require( ...
 - python实现自动发送邮件
			
Python发送邮件成功的前提,应是先开启授权码.目前使用广泛的邮箱有:163邮箱.qq邮箱等. 163邮箱开启授权码的方法如下图: qq邮箱开启授权码的方法如下图: 接下来代码的实现: import ...
 - 【Unity系统知识】之unity文件操作路径
			
IOS:Application.dataPath : Application/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/xxx ...
 - Spring MVC处理
			
1.首先,用户发送请求,DispatcherServlet会拦截请求,但DispatcherServlet收到请求后不进行处理,而对URL进行解析得到相应的URI(资源标识符). 2.Dispatch ...
 - Throwable  -抛出异常类与自定义异常类
			
/* 自定义异常类 java提供的异常类,不够我们使用,需要自己定义一些异常类 格式: public class XXXException extends Exception/runtimeExcep ...
 - TypeError: 'generator' object is not subscriptable
			
TypeError: 'generator' object is not subscriptable 生成器对象不可以带下标 def get_row(self,row_no): if not isin ...
 - mybatis插件机制及分页插件原理
			
MyBatis 插件原理与自定义插件: MyBatis 通过提供插件机制,让我们可以根据自己的需要去增强MyBatis 的功能.需要注意的是,如果没有完全理解MyBatis 的运行原理和插件的工作方式 ...
 - mysql解析json字符串相关问题
			
很多时候,我们需要在sql里面直接解析json字符串.这里针对mysql5.7版本的分水岭进行区分. 1.对于mysql5.7以上版本 使用mysql的内置函数JSON_EXTRACT(column, ...
 - Windows禅道环境部署
			
1. 禅道下载地址,下载解压 http://www.zentao.net/download/80081.html 一键安装包根据本机系统做相应版本下载 2. 解压完打开文件夹xampp ...
 - Codeforces 1119C(思维)
			
题面 传送门 分析 这种题的重点是寻找不变量 我们发现如果改变4个角,则每一行和每一列的xor和不会改变(1^0=0^1) 所以只要算出异或和然后比较就可以 代码 #include<iostre ...