514D (二分+区间最值)
来源:互联网 发布:黑人假发 知乎 编辑:程序博客网 时间:2024/06/18 10:52
题目传送
题目大意:n*m的矩阵,最多可进行k次操作,每次使得一列上的所有数值-1,若一行的数值全变为0,则该行被破坏。问最长可连续破坏多少行。输出此时对于每一列的操作数。
思路很直接:对于每一列,二分区间长度,枚举起点,求区间最大值。将每一列的区间最值相加,若不超过k,则该长度可行。
对于输出方案,可开设数组a[i]记录长度为i的起点,若最终长度为len,则再次求区间[a[len],a[len]+len-1]的最大值即可。
#include<bits/stdc++.h>using namespace std;#define LL __int64int f[5][100005][20],ans[100005],k,n,m;void rmq(int p,int n){for(int j=1;(1<<j)<=n;++j)for(int i=1;i+(1<<j)-1<=n;++i)f[p][i][j]=max(f[p][i][j-1],f[p][i+(1<<(j-1))][j-1]);}int query(int p,int l,int r){int k=(int)(log(1.0*(r-l+1))/log(2.0));return max(f[p][l][k],f[p][r-(1<<k)+1][k]);}bool judge(int len){ int i,j,s; for(i=1;i+len-1<=n;++i) { s=0; for(j=0;j<m;++j) s+=query(j,i,i+len-1); if(s<=k) { ans[len]=i; return 1; } } return 0;}int main(){ int i,j; scanf("%d%d%d",&n,&m,&k); for(i=1;i<=n;++i) for(j=0;j<m;++j) scanf("%d",&f[j][i][0]); for(i=0;i<m;++i) rmq(i,n); int len=0,l=1,r=n; while(l<=r) { int mid=(l+r)>>1; if(judge(mid)) { l=mid+1; len=mid; } else r=mid-1; } for(i=0;i<m-1;++i) printf("%d ",query(i,ans[len],ans[len]+len-1)); printf("%d\n",query(i,ans[len],ans[len]+len-1)); return 0;}
0 0
- 514D (二分+区间最值)
- HDU 5289 Assignment (ST算法区间最值+二分)
- hdu5289 二分 + 区间最值查询(线段树) + 暴力
- HDU 5289 Assignment (二分+区间最值)
- hdu 2305 WorstWeather Ever 二分 + 线段树(区间最值)
- cf 484b 二分搜索/区间最值
- [BZOJ]1012 [JSOI2008]最大数maxnumber (线段树维护区间最值 || 单调栈+二分查找)
- RMQ(模板 ST 区间最值,区间频繁次数)
- hdu 5124(区间更新,区间最值)
- RMQ( 区间最值,区间频繁次数)
- Codeforces 852D Exploration plan(最短路+二分+二分图匹配)
- RMQ的ST(区间最值)
- rmq问题(区间最值)
- RMQ算法 (区间最值问题)
- RMQ问题(区间最值查询)
- hihoCoder挑战赛20 (区间最值)
- RMQ(快速查询区间最值)
- RMQ(区间最值问题)
- 请求项目管理转产品研发的建议与思路?
- python的列表list方法大全
- HDU 1540 Tunnel Warfare
- 大白话系列之C#委托与事件讲解(一)
- AsyncTask的基本用法
- 514D (二分+区间最值)
- B-Tree/BTree 的Java实现
- saleforce中ActionFunction和SupportFunction的区别
- [转载]chrome developer tool 调试技巧
- Vim常用命令
- 程序员的十大无奈
- 生产guid
- 【LeetCode】006.ZigZag Conversion
- 为什么中国的程序员总被称为码农?