【题目大意】

给一张网格图,上往下有流量限制,下往上没有,左往右有流量限制。

$n * m \leq 2.5 * 10^6$

【题解】

考场直接上最大流,50分。竟然傻逼没看出狼抓兔子。

平面图转对偶图,其中没有流量限制(inf)不用转,然后直接在DAG上分层dp即可。

复杂度$O(nm)$,但是这样过不去被卡常了。

出题人的做法是先处理出每层初始的那个随机数,然后每层往下直接做,这样因为是一维数组,所以寻址方便,不会被卡常。

我的做法是动态开数组(用new),然后比较两维大小来分配第一维给谁,第一维优先分配给小的,第二维给大的。

然后如果n >= m可以用指针优化,所以阈值设为n * 10 >= m即可(虽然没啥必要)

# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int M = 2.5e5 + ;
const int mod = 1e9+; namespace irand {
int A, B, Q, X0;
inline void getseed() {
cin >> A >> B >> Q >> X0;
}
inline int getint() {
return X0 = (1ll * A * X0 + B) % Q;
}
} int n, m, **ad, **bd;
ll f[M]; int main() {
cin >> n >> m; irand :: getseed();
if(n * >= m) {
ad = new int*[m + ]; bd = new int*[m + ]; --n;
for (register int i=; i<=m; ++i) ad[i] = new int[n + ], bd[i] = new int[n + ];
for (register int i=; i<=n; ++i)
for (register int j=; j<=m; ++j)
ad[j][i] = irand :: getint(); for (register int i=; i<n; ++i)
for (register int j=; j<m; ++j)
bd[j][i] = irand :: getint(); for (register int i=; i<m; ++i) {
register int *A = ad[i], *B = bd[i];
for (register int j=; j<=n; ++j) f[j] += A[j];
for (register int j=; j<=n; ++j) f[j] = min(f[j], f[j-]+B[j-]);
for (register int j=n-; j; --j) f[j] = min(f[j], f[j+]+B[j]);
}
ll ans = 1e18;
for (int i=; i<=n; ++i) f[i] += ad[m][i];
for (int i=; i<=n; ++i) ans = min(ans, f[i]);
cout << ans << endl;
return ;
} else {
ad = new int*[n + ]; bd = new int*[n + ]; --n;
for (register int i=; i<=n; ++i) ad[i] = new int[m + ], bd[i] = new int[m + ];
for (register int i=; i<=n; ++i)
for (register int j=; j<=m; ++j)
ad[i][j] = irand :: getint(); for (register int i=; i<n; ++i)
for (register int j=; j<m; ++j)
bd[i][j] = irand :: getint(); for (register int i=; i<m; ++i) {
for (register int j=; j<=n; ++j) f[j] += ad[j][i];
for (register int j=; j<=n; ++j) f[j] = min(f[j], f[j-]+bd[j-][i]);
for (register int j=n-; j; --j) f[j] = min(f[j], f[j+]+bd[j][i]);
}
ll ans = 1e18;
for (int i=; i<=n; ++i) f[i] += ad[i][m];
for (int i=; i<=n; ++i) ans = min(ans, f[i]);
cout << ans << endl;
return ;
}
}

省队集训 Day3 陈姚班的更多相关文章

  1. 省队集训Day3 light

    [问题描述] “若是万一琪露诺(俗称 rhl)进行攻击,什么都好,冷静地回答她的问题来吸引她.对方表现出兴趣的话,那就慢慢地反问.在她考虑答案的时候,趁机逃吧.就算是很简单的问题,她一定也答不上来.” ...

  2. 省队集训Day3 tree

    [题目描述] RHL 有一天看到 lmc 在玩一个游戏. “愚蠢的人类哟,what are you doing”,RHL 说. “我在玩一个游戏.现在这里有一个有 n 个结点的有根树,其中有 m 个叶 ...

  3. bzoj4171 or 省队集训day3 chess: Rhl的游戏

    [题目描述] RHL最近迷上一个小游戏:Flip it.游戏的规则很简单,在一个N*M的格子上,有一些格子是黑色,有一些是白色.每选择一个格子按一次,格子以及周围边相邻的格子都会翻转颜色(边相邻指至少 ...

  4. FJ省队集训DAY3 T2

    思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...

  5. FJ省队集训DAY3 T1

    思路:我们考虑如果取掉一个部分,那么能影响到最优解的只有离它最近的那两个部分. 因此我们考虑堆维护最小的部分,离散化离散掉区间,然后用线段树维护区间有没有雪,最后用平衡树在线段的左右端点上面维护最小的 ...

  6. 【XSY2849】陈姚班 平面图网络流 最短路 DP

    题目描述 有一个\(n\)行\(m\)列的网格图. \(S\)到第一行的每一个点都有一条单向边,容量为\(\infty\). 最后一行的每个点到\(T\)都有一条单向边,容量为\(\infty\). ...

  7. 省队集训 Day3 吴清华

    [题目大意] 给网格图,共有$n * n$个关键节点,横向.纵向距离均为$d$,那么网格总长度和宽度均为$(n+1) * d + 1$,最外围一圈除了四角是终止节点.要求每个关键节点都要通过线连向终止 ...

  8. 省队集训 Day3 杨北大

    [题目大意] 给出平面上$n$个点$(x_i, y_i)$,请选择一个不在这$n$个点之内的点$(X, Y)$,定义$(X, Y)$的价值为往上下左右四个方向射出去直线,经过$n$个点中的数量的最小值 ...

  9. 200万年薪请不到!清华姚班到底有多牛X?

    前几天,清华大学自动化系2020年大一新生的C++作业因为太难而上了热搜,该话题在知乎上的热度一度高达 1300+ 万.  在该帖子下方,有很多关于这件事的讨论,其中很多不禁赞叹"清华太牛 ...

随机推荐

  1. 自定义View 和 ViewGroup

    一. 自定义View介绍 自定义View时, 继承View基类, 并实现其中的一些方法. (1) ~ (2) 方法与构造相关 (3) ~ (5) 方法与组件大小位置相关 (6) ~ (9) 方法与触摸 ...

  2. win8安装Ubuntu14

    概述: 1.复制安装镜像和启动文件到FAT32分区 2.查找出FAT32分区的分区号,修改启动配置文件 3.启动FAT32分区的安装镜像,开始安装 UEFI Win7/8/Ubuntu 硬盘安装Ubu ...

  3. LintCode-66.二叉树的前序遍历

    二叉树的前序遍历 给出一棵二叉树,返回其节点值的前序遍历. 样例 给出一棵二叉树 {1,#,2,3}, 返回 [1,2,3]. 挑战 你能使用非递归实现么? 标签 递归 二叉树 二叉树遍历 非递归 c ...

  4. 网络编程--System.Net

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. 在windows搭建react

    1.安装必须的软件 1.Python 2    注意勾选 Add python.exe to Path,选项,这样就可以在安装完成后,不用手动去添加环境变量    安装完,打开cmd.exe,输入py ...

  6. overflow:scroll 在ios 滚动卡顿

    使用 -webkit-overflow-scrolling 属性控制元素在移动设备上是否使用滚动回弹效果. 值 auto 使用普通滚动, 当手指从触摸屏上移开,滚动会立即停止. touch 使用具有回 ...

  7. deep learning3

    9.3.Restricted Boltzmann Machine (RBM)受限玻尔兹曼基 假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所 ...

  8. 2011 Multi-University Training Contest 4 - Host by SDU

    A.Color the Simple Cycle(polya计数+字符串匹配) 此题的难点在于确定置换的个数,由a[i+k]=a[i], e[i+k]=e[i]联想到KMP. 于是把原串和原串扩大两倍 ...

  9. cf Round 587

    A.Duff and Weight Lifting(思维) 显然题目中只有一种情况可以合并 2^a+2^a=2^(a+1).我们把给出的mi排序一下,模拟合并操作即可. # include <c ...

  10. BZOJ 1042 硬币购物(背包DP+容斥原理)

    可以看出这是个多重背包,运用单调队列优化可以使每次询问达到O(s).这样总复杂度为O(s*tot). 会TLE. 因为改题的特殊性,每个硬币的币值是不变的,变的只是每次询问的硬币个数. 我们不妨不考虑 ...