题意:给定一个长为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 ;
}

最新文章

  1. IRandomAccessStream, IBuffer, Stream, byte[] 之间相互转换
  2. Selenium通过WebDriver控制IE浏览器出错 Browser zoom level was set to 109%. It should be set to 100%
  3. 【转载】推荐5款超实用的.NET性能分析工具
  4. WIN7无法记住远程登录密码
  5. 第十四篇:在SOUI中使用定时器
  6. 项目管理利器——Maven
  7. 对ImageView.ScaleType的详解
  8. iframe整理学习笔记
  9. HDU2527:Safe Or Unsafe(哈弗曼树)
  10. 【SSRS】入门篇(五) -- 设置报表格式
  11. 【dp】求最长公共子序列
  12. jsp基础语言-jsp表达式
  13. 【JavaScript】DOM和BOM之我的理解
  14. maven配置及使用
  15. numpy学习笔记.
  16. 【C++】C++中的字符和字符串
  17. Android生成自定义二维码
  18. oracle_使用udev绑定磁盘方法
  19. WPF中的DoubleAnimation
  20. Python3.5爬取cbooo.cn数据并且同步到mysql中

热门文章

  1. C#-概念-类:类
  2. day02-Javascript之document.write()方法
  3. 【ABAP系列】SAP ABAP基础-abap数据类型的解析整理
  4. lib.tcl
  5. MySQL基础(查)
  6. 深入理解DiscoveryClient
  7. P5459 [BJOI2016]回转寿司
  8. DevExpress 控件中设置分隔符
  9. 缓存模块redis
  10. BUUCTF--reverse3