首页 > 其他分享 >Codeforces 295D Greg and Caves

Codeforces 295D Greg and Caves

时间:2024-05-11 10:57:02浏览次数:20  
标签:295D max sum len int Greg maxn Caves mod

首先可以只考虑有效的行(有黑格的),设有 \(h\) 行,那么就有 \(n - h + 1\) 种分配方式,最后 \(\times (n - h + 1)\) 即可。

对于有效的行,发现如果要考虑中间的部分 \([l, r]\) 其实可以只用 \(len = r - l + 1\) 来表示。
当然肯定会漏掉一些方案的,但考虑知道了 \(\max\{len\}\) 之后,再在列中选,即 \(\times (m - \max\{len\} + 1)\) 就可以了。

因为题目要求了 \(len\ge 2\),不妨令 \(len\leftarrow len - 2, m\leftarrow m - 2\),就变成了 \(len\ge 0\)。

于是可以考虑 \(\text{DP}\),令 \(f_{i, j}\) 为第 \(i\) 行 \(len = j\) 的方案数。
但是发现即可以增大又可以减小,且 \(\max\) 也不好处理,再令 \(f\) 要满足 \(len\) 不减。
转移式即为 \(f_{i, j} = \sum\limits_{k = 0}^j (j - k + 1)f_{i - 1, k}\),考虑做差分有 \(f_{i, j} - f_{i, j - 1} = \sum\limits_{k = 0}^j f_{i - 1, k}\),便可以 \(\mathcal{O}(nm)\) 求出来了。

此时就可以知道 \(\max\{len\}\) 的值了,相当于就是最后的 \(j\),于是有 \(f_{i, j}\leftarrow f_{i, j}\times (m - j + 1)\)。

接下来就考虑把递减的那部分同样 \(\text{DP}\) 求出来。
类似的,令 \(g_{i, j}\) 为不增,且包括前面不降的部分已经有 \(i\) 行了 \(len = j\) 的方案数。
转移时即为 \(g_{i, j} = \sum\limits_{k = j}^m (k - j + 1)g_{i - 1, k} + \sum\limits_{k = j + 1}^m (k - j + 1)f_{i - 1, k}\),这里的 \(f\) 转移不一样是为了避免 \(\max\{len}\) 有多行导致记重的情况。
一样的可以用差分的方法,时间复杂度 \(\mathcal{O}(nm)\)。

同时还需注意,\(g\) 是保证了 \(\max\) 后肯定是有至少一行降的,这会导致算漏 \(\max\) 后面没有有效行的方案数,把 \(f\) 也记入答案即可。

时间复杂度 \(\mathcal{O}(nm)\)。

#include<bits/stdc++.h>
using ll = long long;
constexpr ll mod = 1e9 + 7;
const int maxn = 2e3 + 10;
ll f[maxn][maxn], s[maxn][maxn], g[maxn][maxn];
int main() {
   int n, m;
   scanf("%d%d", &n, &m);
   m -= 2;
   for (int i = 0; i <= m; i++)
      f[1][i] = 1;
   for (int i = 2; i <= n; i++) {
      ll sum = 0;
      for (int j = 0; j <= m; j++) {
         (sum += f[i - 1][j]) %= mod;
         f[i][j] = ((! j ? 0 : f[i][j - 1]) + sum) % mod;
      }
   }
   for (int i = 1; i <= n; i++)
      for (int j = 0; j <= m; j++)
         (f[i][j] *= m - j + 1) %= mod;
   ll ans = 0;
   for (int i = 1; i <= n; i++)
      for (int j = 0; j <= m; j++)
         (ans += f[i][j] * (n - i + 1)) %= mod;
   for (int i = 2; i <= n; i++) {
      ll sum = 0;
      for (int j = m; j >= 0; j--) {
         (sum += f[i - 1][j]) %= mod;
         s[i][j] = ((j == m ? 0 : s[i][j + 1]) + sum) % mod;
      }
      for (int j = 0; j <= m; j++)
         (s[i][j] += mod - f[i - 1][j]) %= mod;
   }
   for (int i = 2; i <= n; i++) {
      ll sum = 0;
      for (int j = m; j >= 0; j--) {
         (sum += g[i - 1][j]) %= mod;
         (g[i][j] += (j == m ? 0 : g[i][j + 1]) + sum) %= mod;
      }
      for (int j = 0; j <= m; j++)
         (g[i][j] += s[i][j]) %= mod;
   }
   for (int i = 1; i <= n; i++)
      for (int j = 0; j <= m; j++)
         (ans += g[i][j] * (n - i + 1)) %= mod;
   printf("%lld\n", ans);
   return 0;
}

标签:295D,max,sum,len,int,Greg,maxn,Caves,mod
From: https://www.cnblogs.com/rizynvu/p/18186056

相关文章

  • B. Greg and Graph
    题意:n个节点的图,每次操作删除一个节点。求每次操作之前,所有的图中的有序对(i,j)的最短路径之和。思路:n<=500,弗洛伊德最短路径算法。因为每次的操作是删除节点,所以可以考虑将操作反着来,每次往图中添加节点,每添加一个节点更新一下最短路径。总结:因为要添加的节点已经存储在了......
  • System.AggregateException: 发生一个或多个错误.....
    System.AggregateException:发生一个或多个错误。--->Microsoft.WebTools.Shared.Exceptions.WebToolsException:生成失败。检查输出窗口了解更多详细信息。---内部异常堆栈跟踪的结尾------>(内部异常#0)Microsoft.WebTools.Shared.Exceptions.WebToolsException:生......
  • SELECT list is not in GROUP BY clause and contains nonaggregated column 'uav.cas
     mysql5.7以上版本抛出错误,SELECTlistisnotinGROUPBYclauseandcontainsnonaggregatedcolumn'uav.case_board.port'whichisnotfunctionallydependentoncolumnsinGROUPBYclause;thisisincompatiblewithsql_mode=only_full_group_bygrougby在5......
  • congregate迁移gitlab数据
    项目地址:https://gitlab.com/gitlab-org/professional-services-automation/tools/migration/congregate/congregate是一款gitlab官方推出的数据迁移工具,可以方便的把其他SCM系统的项目迁移到gitlab实例本次测试主要是源gitlab实例迁移到目标gitlab实例。安装congrega......
  • mongo aggregation
    在mongo中aggregation(聚合应用)1、插入测试数据db.tycoon.insertMany([{item:"paper",tycoon:25,size:{h:14,w:21,cm:"and"},status:"A"},{item:"notebook",tycoon:50,size:{h:8.5,w:11,cm:"in"},status:"B"......
  • Practical Secure Aggregation for Privacy-Preserving Machine Learning
    用于隐私保护机器学习的实用安全聚合(CCS17'(CCFA))摘要我们设计了一种新颖的、通信高效的、抗故障的协议,用于高维数据的安全聚合。我们的协议允许服务器以安全的方式(即不学习每个用户的个人贡献)计算来自移动设备的大型用户持有数据向量的总和,并且可以在联邦学习设置中用于聚合......
  • 机器学习 - PyTorch里的aggregation
    在PyTorch里,可以在tensor里找到min,max,mean,sum等aggregation值。直接上代码importtorchx=torch.arange(0,100,10)print(x)print(f"Minimum:{x.min()}")print(f"Minimum:{torch.min(x)}")print(f"Maximum:{x.max()}")print(f"Maxi......
  • GEE C14 Aggregating Images for Time Series 聚合时间序列图像
    一、CHIRPS数据CHIRPS: theClimateHazardsGroupInfraRedPrecipitationwithStation,全称“气候危害群红外线降水与站点数据”,该数据可利用时间能够追溯到1981年,目前仍然在更新当中,主要用于研究人员分析特定空间在特定时间段内降雨量的变化趋势,从而广泛应用于干旱监测。CH......
  • ApeGNN: Node-Wise Adaptive Aggregation in GNNs for Recommendation论文阅读笔记
    Abstract​ 说明现有的问题:现有的gnn平等地对待用户和项目,不能区分每个节点的不同局部模式,这使得它们在推荐场景中并不理想。​ 提出本文的工作:为了解决这一挑战,我们提出了一个节点级自适应图神经网络框架ApeGNN。ApeGNN开发了一种用于信息聚合的节点级自适应融合机制,使每个节点......
  • abc295D 统计由SS构成的子串个数
    给出长为n的数字串,问它存在多少个子串是happy串?happy串指经重排后,可以由两段同样的内容连起来拼成,比如12341234。数据范围:1<=n<=5E5哈希判断是否相同,只需要判断各个数字出现的奇偶性即可。#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definerep(i,......