首页 > 其他分享 >题解 Gym 102341B【Bulbasaur】/ SS231107C【爬梯高手】

题解 Gym 102341B【Bulbasaur】/ SS231107C【爬梯高手】

时间:2023-12-20 17:48:05浏览次数:32  
标签:10 int 爬梯 Gym 端点 题解 include sum

题解 SS231107C【爬梯高手】

撞原了,好耶!Gym 102341B 顺便把我的变异加强版爆标了!!!

problem

有一个 \(n*m\) 个点的有向分层图,共有 \(n\) 层,每层 \(m\) 个点,每条边一定是从第 \(i\) 层连向第 \(i+1\) 层。

定义 \(f(i,j)\) 表示选择若干条路径,每条路径从第 \(i\) 层出发,在第 \(j\) 层结束,且每条路径在顶点和边上都不交的情况下,最多选择的路径数。

求 \(\sum\limits_{i=1}^n\sum\limits_{j=i+1}^nf(i,j)\)。

\(n\leq 40000, k\leq 9\)。

solution \(O(nk^22^k)\)

题目说的就是 \(i\to j\) 列的最大流,直接改成最小割(注意这里最小割是割点)。我们思维跳跃一下,设:\(f_{i, S, j}\) 表示一个最大的左端点 \(l\),使得从 \(l\) 出发时,现在最小割是 \(j\)(割了 \(j\) 个点),现在已经被割得在第 \(i\) 列的 \(S\) 的位置们结束(\(S\in 2^k\))。这里对流的定义比较奇怪,看作是一些神秘的连通性?然后考虑转移了。

\[f_{i, neighbour(S), j}=\max_{S}f_{i-1, S, j} \]

从上一层流过来。

\[f_{i, \varnothing, 0}=i \]

\[f_{i, S, j} = \max_{u\in S}f_{i, S\backslash\{u\}, j-1} \]

在这一层割点。高维前缀和。

最后答案记 \(sum_j=\sum_{i, S}f_{i, S, j}\),然后做差分,就是每种流量的出现次数,记得减掉自己的。

solution \(O(nk^3)\)

考虑固定左端点之后暴力向后流,例如 \(F(1, n)\),流满了以后把最后的一些点删掉,删到增广最远的地方,然后继续流。移动左端点只需要把左端点删掉,其实不用删掉,就是源点连向新的一列,用一些残量网络加边判连通性的技巧保证复杂度为 \(O(nk^3)\)。

code

solution 1

#include <algorithm>
#include <cassert>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
#ifdef LOCAL
#define debug(...) fprintf(stderr, ##__VA_ARGS__)
#else
#define debug(...) void(0)
#endif
typedef long long LL;
int n, m;
char g[40010][10][10];
int f[2][512][10], gb[9];
LL sum[10];
LL dp() {
  for (int i = 1; i <= n; i++) {
    memset(gb, 0, sizeof gb);
    for (int u = 0; u < m; u++) {
      for (int v = 0; v < m; v++) {
        if (g[i - 1][u][v] == '1') gb[v] |= 1 << u;
      }
    }
    memset(f[i & 1][0], 0, sizeof f[i & 1][0]);
    f[i & 1][0][0] = i;
    for (int S = 1; S < 1 << m; S++) {
      int preS = 0;
      for (int v = 0; v < m; v++) if (S >> v & 1) preS |= gb[v];
      memcpy(f[i & 1][S], f[i & 1 ^ 1][preS], sizeof f[i][S]);
      for (int j = 1; j <= m; j++) {
        for (int u = 0; u < m; u++) 
          if (S >> u & 1) f[i & 1][S][j] = max(f[i & 1][S][j], f[i & 1][S ^ (1 << u)][j - 1]);
      }
    }
    int U = (1 << m) - 1;
    for (int j = 0; j <= m; j++) if (f[i & 1][U][j]) sum[j] += f[i & 1][U][j];
//  for (int S = 0; S < 1 << m; S++)
//    for (int j = 0; j <= m; j++)
//      debug("f[%d][%d][%d] = %d\n", i, S, j, f[i][S][j]);
  }
  LL ans = 0;
  for (int j = 0; j <= m; j++) debug("sum[%d] = %d\n", j, sum[j]);
  for (int j = m; j >= 1; j--) sum[j] -= sum[j - 1];
  sum[m] -= n;
  for (int j = 0; j <= m; j++) ans += sum[j] * j;
  return ans;
}
int main() {
#ifndef NF
  freopen("stairs.in", "r", stdin);
  freopen("stairs.out", "w", stdout);
  cin.tie(nullptr)->sync_with_stdio(0);
#endif
  cin >> n >> m;
  for (int i = 1; i < n; i++) {
    for (int j = 0; j < m; j++) cin >> g[i][j];
  }
  cout << dp() << endl;
  return 0;
}

标签:10,int,爬梯,Gym,端点,题解,include,sum
From: https://www.cnblogs.com/caijianhong/p/solution-SS231107C.html

相关文章

  • U388010 题解
    洛谷U388010题解link:https://www.luogu.com.cn/problem/U388010Sol首先,我们看到这一条件:对于每一个\(1\lei\len\),\(1\lej\len\),\(i\neqj\)满足\(a_i\bmoda_j\neq0,\a_j\bmoda_i\neq0\)。我们知道,质数的因数只有\(1\)和本身,所以当序列里全是质数......
  • 下载图片中文乱码问题解决记录
    1.问题背景需求需要做一个场所码下载的需求,后端接口实现使用的是AWT[1]。在本地Windows开发环境联调接口一切正常,当部署到测试环境Linux服务器上之后,前端同事反馈下载的图片如下:这个问题其实不能算是乱码,而是字体缺失,图片中的汉字使用了微软雅黑字体,而测试环境使用的是docker部......
  • CF1914 G Light Bulbs 题解
    LinkCF1914GLightBulbsQuestion有\(2n\)盏灯摆放在一条直线上,每盏灯有一个颜色\(a_i\),灯的颜色一共有\(n\)种,每个颜色的颜色的灯刚好两盏,灯开始都是熄灭的。你选择几盏灯先打开,然后通过以下规则让其他的灯打开选择\(i,j\)是相同颜色的,一盏亮,一盏不亮,你可以使两盏......
  • 阿里云ECS自建K8S_IPV6重启后异常问题解决过程
    阿里云ECS自建K8S_IPV6重启后异常问题解决过程背景最近安装了一个单节点的K8S_IPV6昨天不知道何故突然宕机了.然后只能在阿里云的控制台后台重启了ECS启动之后看K8S的状态一开始是正常的.但是查看ing的时候,发现IP地址却变成了IPV4的地址,感觉比较奇怪.这里整理一下......
  • CF1872C-Non-coprime-Split-题解
    title:CF1872CNon-coprimeSplit题解date:2023-09-1821:09:14categories:-题解一个很怪的分讨想法。当\(l\neqr\)时,区间内一定有一个偶数。设最大的偶数为\(x\),那么当\(x>2\)时,可以得到一组解\((2,x-2)\),此时\(\gcd(2,x-2)=2\)。当\(l=r\)时,问题......
  • CF1870B-Friendly-Arrays-题解
    title:CF1870BFriendlyArrays题解date:2023-09-2010:32:12categories:-题解翻译给出长度为\(n\)的序列\(a\)和长度为\(m\)的序列\(b\),选出\(b\)中的任意个数(可以不选),让\(a\)的每个数都或上它们,求\(a_1\oplusa_2\oplus\dots\oplusa_n\)的最大值......
  • CF1861C-Queries-for-the-Array-题解
    title:CF1861CQueriesfortheArray题解date:2023-09-0607:53:53categories:-题解因为插入和删除操作都在队尾,所以对序列前缀分析一下:若一个序列的答案为YES,那么它前缀的答案也为YES。(对于没检查过的序列)若一个序列的答案为NO,那么它前缀的答案不确定。(对于没......
  • CF1703E-Mirror-Grid-题解
    title:CF1703EMirrorGrid题解date:2022-07-1511:54:20categories:-题解题目大意给出一个由\(0,1\)组成的矩阵,求最少改变矩阵中的多少个数,使得矩阵旋转\(0^\circ,90^\circ,180^\circ,270^\circ\)后相同。思路在一个\(n\timesn\)的矩阵中,对于任意一......
  • CF1593E-Gardener-and-Tree-题解
    title:CF1593EGardenerandTree题解date:2022-05-2721:30:48categories:-题解原题面题意:给出一个\(n\)个点的树,删除\(k\)次叶子节点,求剩下的节点数。思路:设\(cnt_i\)为\(k\)最小为多少时点\(i\)会被删除。当\(i\)将要被删除时,它一定是现在的叶子,联......
  • CF1866B Battling with Numbers 题解
    前置知识:如果\(p=x^a,q=x^b\),那么\(\gcd(p,q)=x^{\min(a,b)},\operatorname{lcm}(p,q)=x^{\max(a,b)}\)。对于每个\(x\ina_i\),令\(x\)在\(Y\)中的指数为\(d_i\)(实际上不一定),计算贡献时,考虑将\(b_i\)与\(d_i\)分别放入\(p\)和\(q\)中:如果\(b_i<d_i\),贡献为......