ZOJ 1994 Budget 有源汇上下界网络流 可行流
题意:有一个n行m列的矩阵,每个点上都有一个非负整数,现在给出一些约束条件,约束条件的格式 x y op v ,op可能为>,<,=,对于每一个约束,如果x!=0x!=0x!=0&&y!=0y!=0y!=0有(x,y)(x,y)(x,y) opopop vvv ,比如2 4 > 2 就是说(2,4)(2,4)(2,4)这个点的值要大于2。如果xxx为000,则表示为y列的值都共享这个约束,如果yyy为000,则代表x行的值都共享这个约束,如果xxx和yyy都为0,则代表矩阵中所有数都共享这个约束。输出满足这些约束的任意可行方案,并输出矩阵中的值
若op为>则代表这个约束更新下界
若op为<则代表这个约束更新上界
若op为=则代表这个约束更新上下界
这题我写了两份代码。。。
代码1:
//author: CHC//First Edit Time: 2015-09-07 10:56#include <iostream>#include <cstdio>#include <cstring>#include & ...
ZOJ 3229 Shoot the Bullet 有源汇上下界网络流 最大流
题意:某*丝要在n天内给m个女神拍照,对于第 iii 个女神,这n天拍照的总数量不得小于 G\[i\] ,
*丝第 jjj 天要给 $ c_j $ 个女神拍照,并且第 jjj 天有一个拍照上限 DjD_jDj ,
而且这 cjc_jcj 个女神中的第 kkk 个女神在今天的照片数量必须要在 LjkL_{jk}Ljk 和 RjkR_{jk}Rjk 之间。问*丝满足这些条件并且能拍的最大数量的照片,如果不满足输出−1-1−1
建图加上一条边e(et,st,0,+oo)e(et,st,0,+oo)e(et,st,0,+oo),然后按照无汇源上下界网络流建图,按sstsstsst,eeteeteet跑出的流量若不为所有du[i]>0du[i]>0du[i]>0之和,那么说明无解,否则说明有解,然后再按ststst,etetet为源汇跑流,最后输出反向边的流量加上这条边的下界为解,
//author: CHC//First Edit Time: 2015-09-06 10:45#include <iostream>#include <cstdio&g ...
ZOJ 2314 Reactor Cooling 无源汇上下界网络流 可行流
题意:有n个点m条边的单向无环图。每条边有一个水流的上界和下界,水流要大于等于下界小于等于上界,问能否满足这些边的约束条件,如果能输出Yes,并输出每条边的水流,否则输出No
令du[i]du[i]du[i]为节点iii的流入下界之和-流出下界之和
然后若e(u,v,down,up)e(u,v,down,up)e(u,v,down,up)属于原图,那么新的图中的边为e(u,v,0,up−down)e(u,v,0,up-down)e(u,v,0,up−down)
新增超级源点sstsstsst和超级汇点eeteeteet
若du[i]>0du[i]>0du[i]>0,建边e(sst,i,0,du[i])e(sst,i,0,du[i])e(sst,i,0,du[i])
因为du[i]>0du[i]>0du[i]>0的时候,代表这个点的入流下界之和大于出流下界之和,导致新图流量不平衡,所以要增加这个点的出流,所以建边e(sst,i,0,du[i])e(sst,i,0,du[i])e(sst,i,0,du[i])
.
若du[i]<0du[i]& ...
Codeforces Round 318 (Div. 2) E - Bear and Drawing
题意:有一颗n个点的树,然后有两行列数无限的点,问这颗树能否画出。能画出输出Yes,否则输出No
在纸上画一画可以知道,首先对于一个点,它衍生出来的最左边的那个点和最右边的那个点可以衍生出>2个点,这个点除了左边和右边以外的那两个点,只能衍生出2个点,然而这些点又只能衍生出一个点。所以对于每个连接数>2的点来说,它最多只能有2个点连接数>=3
//author: CHC//First Edit Time: 2015-09-09 14:04#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std; ...
Codeforces Round 318 (Div. 2) D - Bear and Blocks
题意:有n列方块,每列方块的高度为aia_iai,现在有一个操作:每次操作时把外围的方块消去(内部方块的定义:内部方块的四个方向上下左右都有方块或地板,这些方块为内部方块,其他方块为外部方块),问需要多少次操作可以将所有方块消去
先考虑普遍情况
3
1 2 1
这种情况只需要2个步骤
5
1 2 3 2 1
这种情况只需要3个步骤
7
1 2 3 4 3 2 1
这种情况只需要4个步骤
所以。。只需要找这n列中的这些部分中最大的那个部分高度,就是需要的操作次数
//author: CHC//First Edit Time: 2015-09-09 12:55#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algor ...
Codeforces Round 318 (Div. 2) C - Bear and Poker
题意:有n个数,对于每个数有两个操作
1.把这个数乘以2
2.把这个数乘以3
操作可以重复无限次
现在问只执行这两个操作能否将所有数都变换为同一个数
如果能把这些数都变换为同一个数,那么说明这些数中的质因子除了2和3以外都相同且质因子个数都相等。因此,把所有数的关于2和3的质因子都剔除,如果所有数都相等的话那么可以变换。
//author: CHC//First Edit Time: 2015-09-08 20:13#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL ...
Codeforces Round 318 (Div. 2) B. Bear and Three Musketeers 位运算压缩
题意:有n个人,m组关系。现在想要从这n个人中选3个人。这3个人必须满足的条件:1)这3个人必须相互认识 2)这3个人的识别度的总和最小(一个人的识别度为:除了另外两人认识的人的数,三个人的识别度相加最小)
如果存在,则输出识别度总和最小的那个值,如果不存在,则输出-1
位运算压缩,将一个点能直接相连的其他点都压缩,然后直接枚举点,然后通过点枚举边,判断共同点就可。
复杂度O(nm)O(nm)O(nm)
//author: CHC//First Edit Time: 2015-09-08 19:32#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits&g ...
Codeforces Round 318 (Div. 2) A - Bear and Elections 模拟暴力枚举
题意:有n个人参加选举,每个人的得票分别为aia_iai,一个人赢的意思是这个人的票大于其他所有人的票。现在1想要赢得选举,他有一个操作就是将其他人的选票贿赂过来,现在问最少需要贿赂多少个人。
因为数据比较小。直接模拟
//author: CHC//First Edit Time: 2015-09-01 10:49#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL;const int MAXN=1e+4;const int INF = numeric_limits& ...
hdu 5430 Reflect 求圆镜内反射N次回到出口的方法数 欧拉函数
题意:从镜面材质的圆上一点发出一道光线反射NNN次后首次回到起点。
问本质不同的发射的方案数。
题解:
为什么要k和(N+1)是最简分数呢。因为要求的是不重复的路径,也就是求的是到了出口后射出去,而不是又反射回来。30+360和30的结果是一样的,但不能算一种。。
代码一:
//author: CHC//First Edit Time: 2015-09-05 19:38#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL;const int INF = nume ...
hdu 5428 The Factor 求一个数列的乘积的最小因子的因子数大于2 筛素数
题意:给一个长度为n的数列,求数列之积的某个最小的因子,这个因子的因子数的个数大于2。
其实就是求出数列中的最小两个质因数的乘积。= =比赛的时候用的是另一种方法居然被hack了。。我擦。。。。
//author: CHC//First Edit Time: 2015-09-05 21:23#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>#include <limits>using namespace std;typedef long long LL;const int MAXN=50000+100;const int INF = numeric_limits<in ...