RMQ -- ST算法 Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army

来源:互联网 发布:淘宝售后过期怎么投诉 编辑:程序博客网 时间:2024/05/05 03:53

RMQ-ST算法: http://kmplayer.iteye.com/blog/575725


每一列用ST记录区间最大值,用两个指针扫描。

#include<stdio.h>#include<string.h>#include<stdlib.h>#include<iostream>#include<algorithm>#include<vector>#include<utility>#include<queue>#include<set>#include<map>#include<math.h>#include<string>using namespace std;#define inf 0x3f3f3f3f#pragma warning(disable:4996)#pragma comment(linker, "/STACK:102400000,102400000")#define ll long longconst double eps = 1e-9;int p[100010][5];int dp[100010][18][5];int main(){int i, j, k, n, m, K;cin >> n >> m >> K;for (i = 0; i < n;i++)for (j = 0; j < m; j++){scanf("%d",&p[i][j]);}for (k = 0; k < m; k++){for (i = 0; i < n; i++){dp[i][0][k] = p[i][k];}}for (k = 0; k < m; k++){for (j = 1; (1 << j) <= n; j++){for (i = 0; i + (1 << j)-1 < n; i++)dp[i][j][k] = max(dp[i][j-1][k],dp[i+(1<<(j-1))][j-1][k]);}}int l = 0, r = 0;int mx = 0, tl=-1, tr=-1;while (1){int t = log((r - l + 1)*1.0) / log(2.0);int sum = 0;for (k = 0; k < m; k++){sum += max(dp[l][t][k],dp[r-(1<<t)+1][t][k]);}if (sum <= K){if (r - l + 1>mx){mx = r - l + 1;tl = l, tr = r;}if (r != n - 1) r++;else if (l != n - 1) l++;else break;}else{if (l != n - 1) l++;}if (r < l) r++;if (r == n - 1 && l == n - 1) break;}if (tl == -1){for (i = 0; i < m;i++)if (i != m - 1) printf("0 ");else printf("0\n");}else{int t = log((tr - tl + 1)*1.0) / log(2.0);for (k = 0; k < m; k++){int h = max(dp[tl][t][k],dp[tr-(1<<t)+1][t][k]);if (k == m - 1) printf("%d\n",h);else printf("%d ",h);}}//system("pause");}


0 0