首页 > TAG信息列表 > ZJOI2011
P3329 [ZJOI2011]最小割
【题意】 多次询问最小割小于等于x的点对数 【分析】 最小割树建好后暴力统计即可 【代码】 #include<bits/stdc++.h> using namespace std; #define mp make_pair #define fi first #define se second #define lson now<<1 #define rson now<<1|1 typedef long long ll; const iP4542-[ZJOI2011]营救皮卡丘【费用流,Floyd】
正题 题目链接:https://www.luogu.com.cn/problem/P4542 题目大意 给出\(n+1\)个点\(m\)条边的无向图,\(k\)个人开始在\(0\)号点,一个人进入\(i\)号点之前必须要有人经过\(i-1\)号点,求第一个人进入\(n\)号点时所有人的最短移动距离和。 \(1\leq n\leq 150,1\leq m\leq 2\times 10^4「ZJOI2011」最小割
「ZJOI2011」最小割 传送门 建出最小割树,然后暴力计算任意两点之间最小割即可。 多组数据记得初始化。 参考代码: #include <algorithm> #include <cstring> #include <cstdio> #include <queue> #define rg register #define file(x) freopen(x".in", "r", stdin), freopen(x&P4542 [ZJOI2011]营救皮卡丘
传送门 分析一下题目,发现每个点必须至少走过一次,并且对于一个人的路径,他摧毁的点编号一定是递增的 并且在摧毁点 $i$ 之前,他不能经过 $i+1$ 到 $n$ 的点,考虑设 $dis[i][j],i<j$ 表示从 $i$ 到 $j$,不经过比 $j$ 大的点的最短路径 因为最终每个点都会被摧毁,那么一个人的总路程就是P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)
P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞 先跑一遍Floyd处理出$dis[i][j]$ 注意到走据点要先走小的才能走大的 也就是说,$i<j<k$时,$dis[i][j]$不能从$k$转移过来 并且实际走路径时,编号也必须从小到大 于是题目转[ZJOI2011]礼物
嘟嘟嘟 正是因为有这样的数据范围,解法才比较暴力。 我们假设取出的长方体常和宽相等,即\(a * a * b\)。这样我们每次换两条边相等,搞三次就行。 那么对于第\(k\)层中的第\((i, j)\)点\((k, i, j)\),求出以这个点为右下角的最大完好的正方形f[k][i][j]。这个可以用倍增求。所以复杂度