题目描述

输入

输出

样例输入

3 2

4 0

-10 8

-2 -2

样例输出

4

数据范围

解法

枚举两条扫描线,在这两条扫描线之间的矩阵,可以将之转化为一个序列b[i]=a[i][1..m]。

然后矩阵上的问题就转化成序列上的问题:

给定一个序列,求最长的连续子序列的和为正数的长度。


考虑到是所有区间问题,考虑分治。

对于一个区间[l,r],要求的是跨两半部分的最长长度。

先求出以mid为右端点的最长子区间;

设一个指针指向mid,考虑右移指针。

如果新加入元素是小于0,那么答案不会更优,左指针肯定要右移至少一位才会使得答案平衡;

如果新加入元素大于0,那么考虑把左指针一直左移直到合法子区间极大。

由于左指针至多左移2∗n,时间复杂度为O(nlogn)。


总的时间复杂度为O(n3logn)。

代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #include<algorithm>
  6. #define ll long long
  7. #define ln(x,y) ll(log(x)/log(y))
  8. #define sqr(x) ((x)*(x))
  9. using namespace std;
  10. const char* fin="max.in";
  11. const char* fout="max.out";
  12. const ll inf=0x7fffffff;
  13. const ll maxn=307;
  14. ll n,m,i,j,k,ans;
  15. ll a[maxn][maxn],b[maxn],sum[maxn][maxn];
  16. ll solve(ll l,ll r){
  17. ll i=0,j=0,k=0,y=0,mid=(l+r)/2,tmp,tmd=0;
  18. if (l==r) return b[l]>0?1:0;
  19. tmp=max(solve(l,mid),solve(mid+1,r));
  20. k=y=0;
  21. for (i=mid;i>=l;i--){
  22. k+=b[i];
  23. if (k>0) tmd=mid-i+1,y=k;
  24. }
  25. tmp=max(tmp,tmd);
  26. j=mid-tmd+1;
  27. i=k=0;
  28. for (i=mid+1;i<=r;i++){
  29. k+=b[i];
  30. if (b[i]>0){
  31. while (j>l && k+y+b[j-1]>0) y+=b[--j];
  32. }else if (b[i]==0){
  33. }else if (j<mid && k+y<=0) y-=b[j++];
  34. if (k+y>0) tmp=max(tmp,i-j+1);
  35. }
  36. return tmp;
  37. }
  38. int main(){
  39. freopen(fin,"r",stdin);
  40. freopen(fout,"w",stdout);
  41. scanf("%lld%lld",&n,&m);
  42. for (i=1;i<=n;i++)
  43. for (j=1;j<=m;j++) scanf("%lld",&a[i][j]),sum[i][j]=a[i][j]+sum[i][j-1];
  44. for (i=1;i<=m;i++)
  45. for (j=i;j<=m;j++){
  46. for (k=1;k<=n;k++) b[k]=sum[k][j]-sum[k][i-1];
  47. ans=max(ans,solve(1,n)*(j-i+1));
  48. }
  49. printf("%lld",ans);
  50. return 0;
  51. }

启发

当要处理子矩阵问题时,可以用两条扫描线把问题转化到序列上。

处理所有区间问题可以考虑分治。

【JZOJ4820】【NOIP2016提高A组模拟10.15】最大化的更多相关文章

  1. 【NOIP2016提高A组模拟10.15】最大化

    题目 分析 枚举两个纵坐标i.j,接着表示枚举区域的上下边界, 设对于每个横坐标区域的前缀和和为\(s_l\),枚举k, 显然当\(s_k>s_l\)时,以(i,k)为左上角,(j,k)为右下角 ...

  2. NOIP2016提高A组模拟10.15总结

    第一题,就是将原有的式子一步步简化,不过有点麻烦,搞了很久. 第二题,枚举上下边界,维护一个单调队列,二分. 比赛上没有想到,只打了个暴力,坑了80分. 第三题,贪心,最后的十多分钟才想到,没有打出来 ...

  3. 【NOIP2016提高A组模拟10.15】打膈膜

    题目 分析 贪心, 先将怪物按生命值从小到大排序(显然按这个顺序打是最优的) 枚举可以发对少次群体攻击, 首先将所有的群体攻击发出去, 然后一个一个怪物打,当当前怪物生命值大于2,如果还有魔法值就放重 ...

  4. 【NOIP2016提高A组模拟10.15】算循环

    题目 分析 一步步删掉循环, 首先,原式是\[\sum_{i=1}^n\sum_{j=1}^m\sum_{k=i}^n\sum_{l=j}^m\sum_{p=i}^k\sum_{q=j}^l1\] 删 ...

  5. 【JZOJ4819】【NOIP2016提高A组模拟10.15】算循环

    题目描述 输入 输出 样例输入 167 198 样例输出 906462341 数据范围 解法 令f(n)=∑ni=1i,g(n)=∑ni=1i2 易得ans=∑ni=1∑mj=1f(n−i+1)∗f( ...

  6. 【NOIP2016提高A组模拟9.15】Osu

    题目 分析 考虑二分答案, 二分小数显然是不可取的,那么我们将所有可能的答案求出来,记录在一个数组上,排个序(C++调用函数很容易超时,手打快排,时间复杂度约为\(O(>8*10^7)\),但相 ...

  7. 【NOIP2016提高A组模拟8.15】Garden

    题目 分析 其实原题就是[cqoi2012][bzoj2669]局部极小值. 有一个n行m列的整数矩阵,其中1到nm之间的每个整数恰好出现一次.如果一个格子比所有相邻格子(相邻是指有公共边或公共顶点) ...

  8. 【JZOJ4784】【NOIP2016提高A组模拟9.15】Map

    题目描述 输入 输出 样例输入 4 4 2 1 2 2 3 3 2 3 4 1 2 1 4 样例输出 14 数据范围 样例解释 upd:保证原图连通. "不相交路径"的定义为不存在 ...

  9. 【NOIP2016提高A组模拟9.15】Map

    题目 分析 发现,当原图是一棵树的时候,那么新建一条边后,就会变成环套树, 而环内的所有点对都是安全点对,如果环中有k个点,答案就是\(k(k-1)\) 联想到,当把原图做一遍tarjan缩点,每个环 ...

随机推荐

  1. 【DM642学习笔记三】flash的烧写

    ICETEK-DM642-PCI板上的29L008B芯片提供了8M位的Flash空间(访问地址空间是CE1,90000000h~90080000h).主要用于自启动功能和存储FPGA的配置数据. 一. ...

  2. Django-rest Framework(六)

    不懂使用机制的直接看源码就好了,也不是很难,能够看得懂 视图家族 1. View:将请求方式与视图类的同名方法建立映射,完成请求响应(原生django) from django.views impor ...

  3. Python的格式化输出--制作名片

    效果图 代码如下: name = input("Your name:")age = int(input("Your age:"))job = input(&qu ...

  4. c# 将Datarow转成Datarowview

    DataRowView rowview= dataTable.DefaultView.Cast<DataRowView>().Where(a => a.Row == tmprow). ...

  5. 利用TensorFlow识别手写的数字---基于两层卷积网络

    1 为什么使用卷积神经网络 Softmax回归是一个比较简单的模型,预测的准确率在91%左右,而使用卷积神经网络将预测的准确率提高到99%. 2 卷积网络的流程 3 代码展示 # -*- coding ...

  6. service network restart 报错重启失败

    Job for network.service failed because the control process exited with error code. See “systemctl st ...

  7. mybatis框架学习:

    一.什么是框架 它是我们软件开发中的一套解决方案,不同的框架解决的是不同的问题 使用框架的好处: 框架封装了很多的细节,使开发者可以使用极简的方式实现功能 大大提高开发效率 二.三层框架 表现层: 用 ...

  8. 通过游戏学python 3.6 第一季 第一章 实例项目 猜数字游戏--核心代码 可复制直接使用 娱乐 可封装 函数

    本文实例讲述了python实现的简单猜数字游戏.分享给大家供大家参考.具体如下: 给定一个1-99之间的数,让用户猜数字,当用户猜错时会提示用户猜的数字是过大还是过小,知道用户猜对数字为止,猜对数字用 ...

  9. TZ_13_微服务场景Eureka

    1.搭建Eureka的注册中心 1.1Eureka几个时间间隔配置详解 1 >客户端信息上报到eureka服务的时间周期,配置的值越小,上报越频繁,eureka服务器应用状态管理一致性越高 #客 ...

  10. 区块链、云计算、大数据、人工智能、FinTech带来的挑战与机遇,中国技术开放日上海站精彩回顾

    区块链.云计算.大数据.人工智能.FinTech带来的挑战与机遇,中国技术开放日上海站精彩回顾 | 作者 韩婷 发布于 2016年12月26日. 估计阅读时间: 不到一分钟 | 欲知区块链.VR.Te ...