显然发现可以二分。

对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行。

可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i]-mid<=sum[j]

维护一个最大的sumj 即可O(1)转移 复杂度nklog 可以获得 40分。

考虑ai>=0 二分完之后直接贪心即可 能选就选 可以证明 这是最优的或者说对后面结果不会更差。

考虑ai<=0 二分完之后可以发现能分成一段就分成一段 只要分的段数>=k即可。

这样总共就可以获得80分了。

code:

const int MAXN=50010,maxn=110;
int n,k,maxx,minn,ans;
int a[MAXN],sum[MAXN];
int f[MAXN][maxn];//f[i][j]表示前i段分成j段是否可行.
int g[MAXN];//g表示在选出若干段满足条件时的段数是多少.
inline int check3(int x)
{
f[0][0]=1;
rep(1,k,j)
{
int mn=j==1?0:-INF;
rep(1,n,i)
{
if(mn>=sum[i]-x)f[i][j]=1;
else f[i][j]=0;
if(f[i][j-1])mn=max(mn,sum[i]);
}
}
return f[n][k];
}
inline int check2(int x)
{
int cnt=0,sum=a[1];
rep(2,n,i)
{
if(sum<=x)
{
++cnt;
sum=a[i];
}
else sum+=a[i];
}
if(sum<=x)++cnt;
return cnt>=k;
}
inline int check1(int x)
{
int cnt=0,sum=a[1];
rep(2,n,i)
{
if(a[i]>x)return 0;
if(sum+a[i]<=x)sum+=a[i];
else ++cnt,sum=a[i];
}
return cnt<=k-1;
}
inline int check4(int x)//选出若干段使得权值<=x
{
int mn=0,p=0;
rep(1,n,i)
{
if(mn>=sum[i]-x)g[i]=g[p]+1;
else g[i]=-1;
if(sum[i]>mn&&g[i]!=-1)
{
mn=sum[i];p=i;
}
}
return g[n]!=-1;
}
inline int check(int x)//每选出一段 权值加x
{
int l=minn,r=maxx;
while(l<r)//在有附加值的时候继续二分最小值.
{
int mid=(l+r)>>1;
if(check4(mid-x))r=mid;
else l=mid+1;
}
check4(r-x);ans=r-x;
if(g[n]==-1)return 0;
return g[n]<=k;
}
int main()
{
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
get(n);get(k);
int flag1=0,flag2=0;
rep(1,n,i)
{
get(a[i]);
sum[i]=sum[i-1]+a[i];
if(a[i]<0)flag1=1,minn+=a[i];
if(a[i]>0)flag2=1,maxx+=a[i];
}
if(!flag1)//ai>=0
{
int l=minn,r=maxx;
while(l<r)
{
int mid=(l+r)>>1;
if(check1(mid))r=mid;
else l=mid+1;
}
put(r);return 0;
}
if(!flag2)//ai<=0
{
int l=minn,r=maxx;
while(l<r)
{
int mid=(l+r)>>1;
if(check2(mid))r=mid;
else l=mid+1;
}
put(r);return 0;
}
if(n<=100||k<=100)
{
int l=minn,r=maxx;
while(l<r)
{
int mid=(l+r)>>1;
if(check3(mid))r=mid;
else l=mid+1;
}
put(r);return 0;
}
return 0;
}

从中我们发现第一个dp很接近正解了 K一定是可以被优化掉的。恰好K段->WQS二分,广义容斥啥的。

这道题 很有趣 从第二个部分分 可以发现 我们得到最小分的段数x 对于K>=x都是可以的。

第三个部分分 得到最大的分段数 对于K<=x都是可以的。

从中我们可以猜想 对于 一个答案mid 求出最多的分段 求出最小的分段 那么处于中间的K段就是可行的。

我也不会证明hh...但是题目提示的很明显 这也算是一道结论题吧 暴力打表或许可以证明。

这样K就被我们优化掉了 把先前的dp改一下 表示最多/最少分的段数 发现这个很容易使用树状数组优化(常数也小。

总复杂度nlog^2.

const int MAXN=50010<<1,maxn=110;
int n,k,maxx,minn,ans,num,cnt;
int a[MAXN],sum[MAXN];
int f[MAXN],b[MAXN];
int c[MAXN];
int s1[MAXN],s2[MAXN];
inline int ask(RE int x)
{
int cnt=INF;
while(x)
{
cnt=min(cnt,c[x]);
x-=x&(-x);
}
return cnt;
}
inline void insert(RE int x,RE int y)
{
while(x<=num)
{
if(c[x]<=y)return;
c[x]=min(c[x],y);
x+=x&(-x);
}
}
inline int ask1(RE int x)
{
int cnt=-INF;
while(x)
{
cnt=max(cnt,c[x]);
x-=x&(-x);
}
return cnt;
}
inline void insert1(RE int x,RE int y)
{
while(x<=num)
{
if(c[x]>=y)return;
c[x]=max(c[x],y);
x+=x&(-x);
}
}
inline int check(RE int x)
{
cnt=n;
rep(1,n,i)b[i]=sum[i],b[++cnt]=sum[i]-x;
b[++cnt]=0;num=0;
sort(b+1,b+1+cnt);
rep(1,cnt,i)if(i==1||b[i]!=b[i-1])b[++num]=b[i];
s1[0]=num+1-(lower_bound(b+1,b+1+num,0)-b);
rep(1,num,i)c[i]=INF;
insert(s1[0],0);
rep(1,n,i)
{
s1[i]=num+1-(lower_bound(b+1,b+1+num,sum[i])-b);
s2[i]=num+1-(lower_bound(b+1,b+1+num,sum[i]-x)-b);
f[i]=ask(s2[i])+1;
if(f[i]<n)insert(s1[i],f[i]);
}
if(f[n]>k)return 0;
rep(1,num,i)c[i]=-INF;
insert1(s1[0],0);
rep(1,n,i)
{
f[i]=ask1(s2[i])+1;
if(f[i]<n)insert1(s1[i],f[i]);
}
if(f[n]<k)return 0;
return 1;
}
int main()
{
freopen("divide.in","r",stdin);
freopen("divide.out","w",stdout);
get(n);get(k);
rep(1,n,i)
{
get(a[i]);
sum[i]=sum[i-1]+a[i];
if(a[i]<=0)minn+=a[i];
if(a[i]>=0)maxx+=a[i];
}
int l=minn,r=maxx;
while(l<r)
{
int mid=(l+r)>>1;
if(check(mid))r=mid;
else l=mid+1;
}
put(l);return 0;
}

4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp的更多相关文章

  1. 【NOIP模拟赛】飞(fly) 数论+树状数组

    树状数组一个被发明以来广为流行的数据结构,基于数组,核心是lowerbit()操作.他向前lowerbit()操作为前缀,向后lowerbit()操作为上辖,我们运用树状数组都是使一个由O(1)变为O ...

  2. 树状数组优化DP 【模拟赛】删区间

    哇,难受得一匹. 看到题的一瞬间竟然只想到了\(n^3\)的区间\(DP\) 一.\(40pts\) 设\(f[i][j]\)代表删去\(i\)到\(j\)这一段区间的最小代价和. 然后直接写普通的区 ...

  3. 2018 CCPC网络赛 1010 hdu 6447 ( 树状数组优化dp)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 思路:很容易推得dp转移公式:dp[i][j] = max(dp[i][j-1],dp[i-1][j ...

  4. 2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组

    2019-ACM-ICPC-徐州站网络赛- I. query-二维偏序+树状数组 [Problem Description] ​ 给你一个\([1,n]\)的排列,查询\([l,r]\)区间内有多少对 ...

  5. [CSP-S模拟测试]:序列(二分答案+树状数组)

    题目传送门(内部题98) 输入格式 第一行一个整数$n$,第二行$n$个整数$a_1\sim a_n$,第三行$n$个整数$b_1\sim b_n$. 输出格式 一行一个整数表示$\max(r-l+1 ...

  6. 【序列莫队+树状数组】BZOJ3289-Mato的文件管理

    [题目大意] 一共有n份,每份有一个大小和一个编号.Mato每天随机选一个区间[l,r],拷贝出来(即对原序列不影响),给它们排序,并且每次只能交换相邻两份文件.问每天最少交换几次? [思路] 显然, ...

  7. POJ 3321 Apple Tree(后根遍历将树转化成序列,用树状数组维护)

    题意:一棵树,有很多分叉,每个分叉上最多有1个苹果. 给出n,接下来n-1行,每行u,v,表示分叉u,v之间有树枝相连.这里数据中u相当于树中的父节点,v相当于子节点. 给出两个操作: 1.C x  ...

  8. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  9. BZOJ 3744: Gty的妹子序列 【分块 + 树状数组 + 主席树】

    任意门:https://www.lydsy.com/JudgeOnline/problem.php?id=3744 3744: Gty的妹子序列 Time Limit: 20 Sec  Memory ...

随机推荐

  1. let import export React入门实例教程 connect provider combineReducers 箭头函数 30分钟掌握ES6/ES2015核心内容 Rest babel

    let与var的区别 http://www.cnblogs.com/snandy/archive/2015/05/10/4485832.html es6 导入导出 http://www.csdn.ne ...

  2. kibana限制用户只具备读图的权限

    假设需求 因为业务需要将日志系统收集到的信息进行图表化展示并交付到用户进行业务交流. 解决方案 这个需求看着似乎蛮简单的,如何解决? 1.对需要的数据进行过滤制作图表 2.对用户的权限限制为只读级别, ...

  3. ZJOI2008 骑士(树型DP)

    ZJOI2008 骑士 题目大意 给出n个人的战斗力和每个人讨厌的人,然后问最大能有多大的战斗力 solution 简单粗暴的题意,有一丢丢背包的感觉 那敢情就是DP了 有点像没有上司的舞会,,, 根 ...

  4. 深入Mybatis源码——执行流程

    前言 上一篇分析Mybatis是如何加载解析XML文件的,本篇紧接上文,分析Mybatis的剩余两个阶段:代理封装和SQL执行. 正文 代理封装 Mybatis有两种方式调用Mapper接口: pri ...

  5. Mysql常用sql语句(23)- update 修改数据

    测试必备的Mysql常用sql语句系列 https://www.cnblogs.com/poloyy/category/1683347.html 前言 update 也是DML语句哦(数据操作语言) ...

  6. day58 前端收尾

    目录 一.jQuery结束 1 阻止后续事件执行 2 阻止事件冒泡 3 事件委托 4 页面加载 5 动画效果 6 补充知识点 二.前端框架Bootstrap 1 布局容器 2 栅格系统 3 栅格参数 ...

  7. 机器学习实战基础(三十六):随机森林 (三)之 RandomForestClassifier 之 重要属性和接口

    重要属性和接口 至此,我们已经讲完了所有随机森林中的重要参数,为大家复习了一下决策树的参数,并通过n_estimators,random_state,boostrap和oob_score这四个参数帮助 ...

  8. LeetCode 82,考察你的基本功,在有序链表中删除重复元素II

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第51篇文章,我们来看LeetCode第82题,删除有序链表中的重复元素II(Remove Duplicates ...

  9. 01-flask电商项目开发基础配置

    本项目前端采用vue-cli的脚手架,后端采用Flask的Web框架.项目通过完成用户管理.权限管理.商品管理.订单管理.统计管理等功能,综合了前后端的知识,希望使大家都能受益. 1.使用到的技术如下 ...

  10. P1136 迎接仪式 题解

    题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出"欢迎欢迎欢迎欢 ...