【题目大意】

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

$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. 第三章——供机器读取的数据(XML)

    本书使用的文件.代码:https://github.com/huangtao36/data_wrangling 机器可读(machine readable)文件格式: 1.逗号分隔值(Comma-Se ...

  2. LintCode-73.前序遍历和中序遍历树构造二叉树

    前序遍历和中序遍历树构造二叉树 根据前序遍历和中序遍历树构造二叉树. 注意事项 你可以假设树中不存在相同数值的节点 样例 给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:    ...

  3. PAT L1-048 矩阵A乘以B

    https://pintia.cn/problem-sets/994805046380707840/problems/994805082313310208 给定两个矩阵A和B,要求你计算它们的乘积矩阵 ...

  4. [CLR via C#]异常和状态管理

    当CLR检测到某个正在运行的.NET应用程序处于一种特殊的正常执行顺序被打断的状态时,会生成一个异常对象来表示这个错误,并将此对象在方法调用堆栈中向上传送.如果一个程序引发了一个异常却没有处理,CLR ...

  5. Android基础------高级ul:消息提示

    前言:Android消息提示笔记,刚刚接触Android 1.静态方法Toast 直接调用静态方法 //消息提示(context,"内容",固定时间) Toast.makeText ...

  6. coreldraw x5提示盗版警告解决方法

    CorelDRAW是一款图形图像软件,大多数用户使用的都是coreldraw x5破解版,所以基本上都收到了coreldraw x5提示盗版警告,导致不能用,没关系,绿茶小编有解决方法. coreld ...

  7. nginx 反向代理 ,入门

    入门:http://www.cnblogs.com/jjzd/p/6691500.html 启动,重新加载:http://blog.csdn.net/zhongguozhichuang/article ...

  8. HtmlHelper扩展实例

    namespace System.Web.Mvc{    public static  class MyHttpHelperExt    { public static string MyLabel( ...

  9. query 获取本身的HTML

    <div class="test"><p>hello,你好!</p></div> <script> $(".t ...

  10. MATLAB strcmp

    比较两个输入字符串是否相等 c = strcmp(str1,str2)比较字符串 str1 与 str2 ,若完全相等则返回 1 ,不相等返回 0 str1 = 'hello'; str2 = 'he ...