标题 3161: 蓝桥杯2023年第十四届省赛真题-子矩阵

打印 上一主题 下一主题

主题 1881|帖子 1881|积分 5643

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
 标题


 

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 1010, mod = 998244353;
  5. int g[N][N];
  6. int rmin[N][N], rmax[N][N];
  7. ll mmin[N][N], mmax[N][N];
  8. int q[N * N];
  9. int hh, tt;
  10. int n, m, a, b;
  11. int main()
  12. {
  13.   cin >> n >> m >> a >> b;
  14.   for (int i = 1; i <= n; i++)
  15.   {
  16.     for (int j = 1; j <= m; j++)
  17.     {
  18.       cin >> g[i][j];
  19.     }
  20.   }
  21.   for (int i = 1; i <= n; i++)
  22.   {
  23.     hh = 0, tt = -1;
  24.     for (int j = 1; j <= m; j++)
  25.     {
  26.       if (hh <= tt && j - q[hh] + 1 > b)
  27.         hh++;
  28.       while (hh <= tt && g[i][q[tt]] >= g[i][j])
  29.         tt--;
  30.       q[++tt] = j;
  31.       if (j >= b)
  32.         rmin[i][j - b + 1] = g[i][q[hh]];
  33.     }
  34.   }
  35.   for (int j = 1; j <= m; j++)
  36.   {
  37.     hh = 0, tt = -1;
  38.     for (int i = 1; i <= n; i++)
  39.     {
  40.       if (hh <= tt && i - q[hh] + 1 > a)
  41.         hh++;
  42.       while (hh <= tt && rmin[q[tt]][j] >= rmin[i][j])
  43.         tt--;
  44.       q[++tt] = i;
  45.       if (i >= a)
  46.         mmin[i - a + 1][j] = rmin[q[hh]][j];
  47.     }
  48.   }
  49.   for (int i = 1; i <= n; i++)
  50.   {
  51.     hh = 0, tt = -1;
  52.     for (int j = 1; j <= m; j++)
  53.     {
  54.       if (hh <= tt && j - q[hh] + 1 > b)
  55.         hh++;
  56.       while (hh <= tt && g[i][q[tt]] <= g[i][j])
  57.         tt--;
  58.       q[++tt] = j;
  59.       if (j >= b)
  60.         rmax[i][j - b + 1] = g[i][q[hh]];
  61.     }
  62.   }
  63.   for (int j = 1; j <= m; j++)
  64.   {
  65.     hh = 0, tt = -1;
  66.     for (int i = 1; i <= n; i++)
  67.     {
  68.       if (hh <= tt && i - q[hh] + 1 > a)
  69.         hh++;
  70.       while (hh <= tt && rmax[q[tt]][j] <= rmax[i][j])
  71.         tt--;
  72.       q[++tt] = i;
  73.       if (i >= a)
  74.         mmax[i - a + 1][j] = rmax[q[hh]][j];
  75.     }
  76.   }
  77.   ll ans = 0;
  78.   for (int i = 1; i + a - 1 <= n; i++)
  79.   {
  80.     for (int j = 1; j + b - 1 <= m; j++)
  81.     {
  82.       ans = (ans + (mmin[i][j] * mmax[i][j]) % mod) % mod;
  83.     }
  84.   }
  85.   cout << ans;
  86. }
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表