穿梭时间的画面的钟 从反方向 开始移动|

tmjyh09

园龄:3年2个月粉丝:1关注:3

P8572 [JRKSJ R6] Eltaw 题解

注意到题目中给了一个奇怪的数据范围 1nk5105,考虑根号分治。

  1. k>51055105707)时,n 就会比较小,所以可以预处理出 fi,j 来代表 [l,r] 这个区间的最大值,预处理 O(nk),查询 O(1)

  2. k707 时,n 较大,所以搞个前缀和来优化。查询时间复杂度 O(k)

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int M = 707;
int n, k, q;
int f[M][M];
signed main()
{
cin.tie(nullptr) -> sync_with_stdio(false);
cin >> n >> k >> q;
vector<vector<int>> a(k + 1, vector<int>(n + 1));
for (int i = 1; i <= k; i ++ )
for (int j = 1; j <= n; j ++ )
cin >> a[i][j], a[i][j] += a[i][j - 1];
if (k > M)
{
for (int i = 1; i <= n; i ++ )
{
for (int j = i; j <= n; j ++ )
{
for (int id = 1; id <= k; id ++ )
{
f[i][j] = max(f[i][j], a[id][j] - a[id][i - 1]);
}
}
}
}
while (q -- )
{
int l, r;
cin >> l >> r;
int ans = 0;
if (k <= M)
{
for (int i = 1; i <= k; i ++ )
ans = max(ans, a[i][r] - a[i][l - 1]);
cout << ans << '\n';
}
else
{
cout << f[l][r] << '\n';
}
}
return 0;
}

本文作者:tmjyh09

本文链接:https://www.cnblogs.com/tmjyh09/p/16755361.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   tmjyh09  阅读(58)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起