CF513C Maximum Subrectangle
文章目录
- 题目
- 题目大意
- 思路
- 代码
题目
传送门
题目大意
给出分别有N,MN,MN,M个元素的序列a,ba,ba,b,定义一个乘积矩阵,其中的元素ci,j=ai×bjc_{i,j}=a_i\times b_jci,j=ai×bj,找到它的一个最大面积子矩阵,使得这个子矩阵的元素之和不大于给定的XXX。所有数都是正数,N,M≤2000N,M\leq 2000N,M≤2000。
思路
比赛的时候第一次151515分钟内切掉前222题,剧烈膨胀,结果大脑抽筋死在第333题。
设这个矩阵左上角为ci1,j1c_{i_1,j_1}ci1,j1,右下角为ci2,j2c_{i_2,j_2}ci2,j2,那么它的元素之和为:∑i=i1i2∑j=j1j2ai×bj\sum\limits_{i=i_1}^{i_2}\sum\limits_{j=j_1}^{j_2}a_i\times b_ji=i1∑i2j=j1∑j2ai×bj
化简一下得:∑i=i1i2ai∑j=j1j2bj\sum\limits_{i=i_1}^{i_2}a_i\sum\limits_{j=j_1}^{j_2}b_ji=i1∑i2aij=j1∑j2bj
记录一下a,ba,ba,b的前缀和记为suma,sumbsum_a,sum_bsuma,sumb,于是得到:(suma[i2]−suma[i1−1])×(sumb[j2]−sumb[j2−1])≤X(sum_a[i_2]-sum_a[i_1-1])\times(sum_b[j_2]-sum_b[j_2-1])\leq X(suma[i2]−suma[i1−1])×(sumb[j2]−sumb[j2−1])≤X
相当于是从a,ba,ba,b中分别找一段元素之和乘起来不大于XXX。
以上内容是比赛时想到的。
然后先想了个O(logNlogM⋅NM)O(logNlogM·NM)O(logNlogM⋅NM),写着写着发现是错的。
然后想了个用set
乱搞O((logN+logM)NM)O((logN+logM)NM)O((logN+logM)NM)的,交上去只过了样例,WA
了三次后发现思路还是错的。
我直到比赛结束都觉得是个二分搜索。
于是我颓废了。
接下来是正解。
可以用O(N2)O(N^2)O(N2)和O(M2)O(M^2)O(M2)时间处理出a,ba,ba,b中长度为len
的一段区间的最小元素和Sa[len],Sb[len]S_a[len],S_b[len]Sa[len],Sb[len]。
然后再用O(NM)O(NM)O(NM)枚举从aaa中选长度为iii,bbb中选长度为jjj的一段,它们乘积之和最小为Sa[i]×Sb[j]S_a[i]\times S_b[j]Sa[i]×Sb[j],如果这个值不大于XXX,说明可以,就更新答案。
我突然觉得自己不够贪心啊= =
代码
早上起来赶的,写得丑不要介意。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;#define MAXN 2000
#define LL long long
int N[2],X,Ans;
LL Sum[2][MAXN+5],MinSum[3][MAXN+5];int main(){scanf("%d%d",&N[0],&N[1]);for(int i=0;i<=1;i++)for(int j=1;j<=N[i];j++){int t;scanf("%d",&t);Sum[i][j]=Sum[i][j-1]+t;}scanf("%d",&X);memset(MinSum,0x7f,sizeof MinSum);for(int i=0;i<=1;i++)for(int len=1;len<=N[i];len++)for(int j=len;j<=N[i];j++)MinSum[i][len]=min(MinSum[i][len],Sum[i][j]-Sum[i][j-len]);for(int i=1;i<=N[0];i++)for(int j=1;j<=N[1];j++)if(MinSum[0][i]*MinSum[1][j]<=X)Ans=max(Ans,i*j);printf("%d",Ans);
}
CF513C Maximum Subrectangle相关推荐
- Maximum Subrectangle(矩阵,前缀和)
You are given two arrays aa and bb of positive integers, with length nn and mm respectively. Let cc ...
- 【CodeForces - 1060C】Maximum Subrectangle (思维,预处理前缀和,dp,枚举长度)
题干: You are given two arrays aa and bb of positive integers, with length nn and mmrespectively. Let ...
- CF1060C Maximum Subrectangle
现在给出一个长度为$N$的$a$数列,一个长度为$M$的$b$数列. 现在需要构造出一个矩阵$c$,其中$c_{i,j}=a_i \times b_j$.再给出一个$x$,请在矩阵中找出一个最大的矩形 ...
- Maximum Subrectangle(CodeForces-1060C#513)(预处理优化暴力)
文章目录 前言 题目 题目大意: 数据范围 思路 $O(n^6)$ $O(n^4)$ $O(n^3log_n)$ $O(n^2log_{n^2})$ 代码 $O(n^2)$ 代码 题外话 前言 打的时 ...
- Codeforces Round #513
A. Phone Numbers 题意:给一些数字,每个电话号码以8开头,11位,求最多组成多少个号码,重复累加. #include <bits/stdc++.h>using namesp ...
- Codeforces Round #513 总结
首次正式的$Codeforces$比赛啊,虽然滚粗了,然而终于有$rating$了-- #A Phone Numbers 签到题,然而我第一次写挂了(因为把11看成8了--) 只需要判断一下有多少个 ...
- HRBU 2021年暑期训练阶段三Day1
目录 A - Similar Strings 题目链接: 题意: 做法: B - card card card 题目链接: 题意: 做法: C - String 题目链接: 题意: 做法: D - C ...
- 【C++】C++11 STL算法(六):最小/最大操作(Minimum/maximum operations)、比较运算(Comparison operations)
目录 最小/最大操作(Minimum/maximum operations) 一.max 1.原型: 2.说明: 3.官方demo 二.max_element 1.原型: 2.说明: 3.官方demo ...
- Lintcode42 Maximum Subarray II solution 题解
[题目描述] Given an array of integers, find two non-overlapping subarrays which have the largest sum.The ...
最新文章
- jboss 反序列化 getshell
- windows2003权限如何配置
- 上海2021年高考成绩排位查询,2021年上海各高中高考成绩排名及放榜最新消息
- 结构struct(值类型)在实际应用要注意的二点:
- 发一个统计项目代码行数的Java代码
- java 正则首位8或者9的8位数字_正则简单手机号和邮箱练习
- qt + opencv249配置转+续写
- 终于等到你:国内***团队360Vulcan公布iOS 12.1越狱漏洞细节
- TeX排版系统安装使用
- 梅特勒托利多xk3124电子秤说明书_梅特勒托利多电子称设置方法
- QCC512x QCC302x PIO 按键
- mysql 拼音查询_MySQL拼音首字母查询
- excel max函数的使用
- 100000以内的水仙花数C语言,找出1000000内的水仙花数
- 揭露富爸爸背后真正的秘密
- nyoj54小明的存钱计划
- Android 关于所谓的 深度睡眠 的问题
- [杂谈] 14. Catalan卡特兰数
- linux清除大文件命令,linux du df命令清除不要的大文件
- [344]python根据文章标题内容自动生成摘要