bzoj 3158 千钧一发——网络流】的更多相关文章

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 发现偶数之间一定满足第二个条件:奇数之间一定满足第一个条件 ( \( (2m+1)^{2}+(2n+1)^{2}=4m^{2}+4m+1+4n^{2}+4n+1 \),这是个偶数,所以 T2 的 T 一定是偶数:偶数的平方一定是4的倍数,不能有那个 +2  ). 所以如果把不合法的连起来,就是一个二分图.可以用最小割做,不合法之间的连边是 INF 这样. 注意判断第一个条件的时候不用…
3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1201  Solved: 446[Submit][Status][Discuss] Description   Input 第一行一个正整数N. 第二行共包括N个正整数,第 个正整数表示Ai. 第三行共包括N个正整数,第 个正整数表示Bi. Output 共一行,包括一个正整数,表示在合法的选择条件下,可以获得的能量值总和的最大值. Sample Input 4 3 4 5 1…
3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 767  Solved: 290[Submit][Status][Discuss] Description   Input 第一行一个正整数N. 第二行共包括N个正整数,第 个正整数表示Ai. 第三行共包括N个正整数,第 个正整数表示Bi. Output 共一行,包括一个正整数,表示在合法的选择条件下,可以获得的能量值总和的最大值. Sample Input 4 3 4 5 12…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 \( a[i] \) 是奇数则满足条件1,是偶数则显然满足条件2: 因为如果把两个奇数的 \( a[i] \) 写成 \( 2*n+1 \) 和 \( 2*m+1 \),那么: \( a[i]^{2} + a[j]^{2} = (2*n+1)^{2} + (2*m+1)^{2} = 4*(n^{2}+n+m^{2}+m) + 2 \) 这是个偶数,所以如果它是完全平方数,那么一定是一…
题面:BZOJ传送门 和方格取数问题很像啊 但这道题不能像网格那样黑白染色构造二分图,所以考虑拆点建出二分图 我们容易找出数之间的互斥关系,在不能同时选的两个点之间连一条流量为$inf$的边 由于我们是拆点建的图,所以对于两个点$x,y$,$x1$向$y2$连边,$y1$向$x2$连边,边权均为$inf$ 然后就是最大权闭合图的裸题了,源点$S$向所有$1$点连边,所有$2$点向汇点$T$连边,边权为$b_{i}$ 跑最大流.最终答案是$\sum b_{i}-$最大流$/2$,$/2$是因为拆点…
这个条件非常妙啊,奇数和奇数一定满足1,因为\( (2a+1)^2+(2b+1)^2=4a^2+4a+4b^2+4b+2=2(2(a^2+a+b^2+b)+1) \)里面这个一定不是平方数因为除二后是个奇数不能再分一个2出来:偶数和偶数一定满足2,因为gcd>=2 考虑最小割,先加上所有收益然后求割之后满足条件的最小代价 所以对于a[i]&1,连接(s,i,b[i]),否则连接(i,t,b[i]),对于不能同时选的i,j来说,连(i,j),表示要么割掉i的收益要么割掉j的收益 #includ…
分析: 偶数对满足条件2,所有奇数对满足条件1. 如果你能一眼看出这个规律,这道题就完成了一半. 我们只需要将数分为两类,a值为奇数,就从S向这个点连容量为b值的边,a值为偶数,就从这个点向T连容量为b值的边. 暴力枚举,对于奇集合和偶集合中不能共存的两个数,连容量为无穷大的边. 求出最小割,代表这个割集要被我们舍弃. 然后直接用b值总和减去最小割就好. 代码: #include<bits/stdc++.h> #define ms(a,x) memset(a,x,sizeof(a)) #def…
二分答案,网络流判断 将每个门拆点,每个人连向每个门的dis~当前解 然后跑最大流,如果等于人数,即为可行解 #include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<map> #define pa pair<int,int> #define N 405 #define inf 0x7…
链接 BZOJ 2561 题解 用Kruskal算法的思路来考虑,边(u, v, L)可能出现在最小生成树上,就是说对于所有边权小于L的边,u和v不能连通,即求最小割: 对于最大生成树的情况也一样.容易看出两个子问题是各自独立的,把两个最小割相加即可. #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #include <queue> using…
很普通的拆点网络流,把每个柱子拆成两个点(i,j,0)和(i,j,1).对于柱子的高度限制则加边((i,j,0),(i,j,1),height). 两个柱子能互相到达则加边((i,j,1),(i1,j1,0),INF). 能到达边界的柱子加边((i,j,1),t,INF).有蜥蜴的柱子加边(s,(i,j,0),1). 跑一遍最大流,答案就是总蜥蜴数-最大流. # include <cstdio> # include <cstring> # include <cstdlib&g…