http://www.lydsy.com/JudgeOnline/problem.php?id=3158 (题目链接)

题意

  给出n个装置,每个装置i有一个特征值a[i]和一个能量值b[i],要求选出能量值和尽可能大的装置,使它们两两之间至少满足一下两条件中的1个条件:1.不存在T,a[i]*a[i]+a[j]*a[j]=T*T;2.gcd(a[i],a[j])>1。

Solution

  通过观察与思考,我们可以发现,如果把不符合条件的两个装置用边连接起来,最后要求的就是带权最大独立集,然而这是一般图,难道还要去写最大团?这是不现实的,考虑它是否满足二分图的性质。

  写写画画以后,发现:

    对于两个偶数来说,它们之间的gcd至少为2,也就是满足第二个条件,任意两个偶数之间都没有边相连。

    对于两个奇数来说,它们的平方和$=2*(2a^2+2b^2+2a+2b+1)$,偶数*奇数,一定满足条件1,任意两个奇数之间都没有边相连。

  于是这就是个二分图了,奇数放左边,偶数放右边,然后最小割求二分图带权最大独立集。

细节

  sqrt出来放到一个LL里面。。。如果放在一个double中,那么就不是正整数T了。。。难怪一直0ms Wa。。

代码

// bzoj3158
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<queue>
#define LL long long
#define inf 2147483640
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=1010;
struct edge {int to,next,w;}e[maxn*maxn*2];
int head[maxn],d[maxn];
LL a[maxn],b[maxn];
int cnt=1,n,m,es,et,ans; int gcd(int a,int b) {return b==0 ? a : gcd(b,a%b);}
void link(int u,int v,int w) {
e[++cnt]=(edge){v,head[u],w};head[u]=cnt;
e[++cnt]=(edge){u,head[v],0};head[v]=cnt;
}
bool bfs() {
memset(d,-1,sizeof(d));
queue<int> q;q.push(es);d[es]=0;
while (!q.empty()) {
int x=q.front();q.pop();
for (int i=head[x];i;i=e[i].next) if (e[i].w && d[e[i].to]<0) {
d[e[i].to]=d[x]+1;
q.push(e[i].to);
}
}
return d[et]>0;
}
int dfs(int x,int f) {
if (x==et || f==0) return f;
int used=0,w;
for (int i=head[x];i;i=e[i].next) if (e[i].w && d[e[i].to]==d[x]+1) {
w=dfs(e[i].to,min(e[i].w,f-used));
e[i].w-=w;e[i^1].w+=w;
used+=w;if (used==f) return used;
}
if (!used) d[x]=-1;
return used;
}
void Dinic() {while (bfs()) ans-=dfs(es,inf);}
int main() {
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%lld",&a[i]);
for (int i=1;i<=n;i++) scanf("%lld",&b[i]),ans+=b[i];
es=n+1;et=n+2;
for (int i=1;i<=n;i++) {
if (a[i]%2==1) link(es,i,b[i]);
else link(i,et,b[i]);
}
for (int i=1;i<=n;i++) {
if (a[i]%2==0) continue;
for (int j=1;j<=n;j++) if (a[j]%2==0) {
if (gcd(a[i],a[j])!=1) continue;
LL x=sqrt(a[i]*a[i]+a[j]*a[j]);
if (x*x!=a[i]*a[i]+a[j]*a[j]) continue;
link(i,j,inf);
}
}
Dinic();
printf("%d",ans);
return 0;
}

  

【bzoj3158】 千钧一发的更多相关文章

  1. BZOJ3158 千钧一发(最小割)

    可以看做一些物品中某些互相排斥求最大价值.如果这是个二分图的话,就很容易用最小割了. 观察其给出的条件间是否有什么联系.如果两个数都是偶数,显然满足条件二:而若都是奇数,则满足条件一,因为式子列出来发 ...

  2. BZOJ3158: 千钧一发

    [传送门:BZOJ3158] 简要题意: 给出n个机器,每个机器有a[i]基础值和b[i]价值 选出一部分机器使得这些机器里面两两至少满足以下两种条件之一: 1.a[i]2+a[j]2!=T2(T为正 ...

  3. [bzoj3158]千钧一发——二分图+网络流

    题目 传送门 题解 很容易建立模型,如果两个点不能匹配,那么连一条边,那么问题就转化为了求一个图上的最大点权独立集. 而我们可以知道: 最大点权独立集+最小点权覆盖集=总权值. 同时最小点权覆盖在一般 ...

  4. 【BZOJ3158】千钧一发 最小割

    [BZOJ3158]千钧一发 Description Input 第一行一个正整数N. 第二行共包括N个正整数,第 个正整数表示Ai. 第三行共包括N个正整数,第 个正整数表示Bi. Output 共 ...

  5. bzoj3158&3275: 千钧一发(最小割)

    3158: 千钧一发 题目:传送门 题解: 这是一道很好的题啊...极力推荐 细看题目:要求一个最大价值,那么我们可以转换成求损失的价值最小 那很明显就是最小割的经典题目啊?! 但是这里两个子集的分化 ...

  6. 【BZOJ-3275&3158】Number&千钧一发 最小割

    3275: Number Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 748  Solved: 316[Submit][Status][Discus ...

  7. BZOJ 3158: 千钧一发

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1201  Solved: 446[Submit][Status][Discuss ...

  8. 【BZOJ】【3158】千钧一发

    网络流/最小割 这题跟BZOJ 3275限制条件是一样的= =所以可以用相同的方法去做……只要把边的容量从a[i]改成b[i]就行了- (果然不加当前弧优化要略快一点) /************** ...

  9. bzoj 3158 千钧一发(最小割)

    3158: 千钧一发 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 767  Solved: 290[Submit][Status][Discuss] ...

随机推荐

  1. swift 随机生成背景颜色

    swift是一门新语言,相关的文档资料现在基本上还不是很完整.在尝试开发过程中,走了不少弯路.在这里记录一下自己的”路“,希望以后能少走弯路. 生成随机背景颜色使用的语法和C#或者JAVA基本一致. ...

  2. translateZ 带来的Z-index 问题

    今天遇到了一个问题,当一个3D变换元素translateZ这个属性的值为负值的时候,这个元素的Z-index就不会其作用,解决方法就是translateZ的值必须大于等于0才能让Z-index 起作用 ...

  3. mac OS X Yosemite 上编译hadoop 2.6.0/2.7.0及TEZ 0.5.2/0.7.0 注意事项

    1.jdk 1.7问题 hadoop 2.7.0必须要求jdk 1.7.0,而oracle官网已经声明,jdk 1.7 以后不准备再提供更新了,所以趁现在还能下载,赶紧去down一个mac版吧 htt ...

  4. 牛X的CSS3

    See the Pen Dot Wave by Rich Howell (@roborich) on CodePen

  5. ubuntu-12.10-server安装图形界面

    1.首先你需要确定你的源文件中 /etc/apt/sources.list 已经使用Universe和Multiverse库.然后使用下面的命令来进行更新源列表和安装图形桌面. sudo apt-ge ...

  6. [MCSM]伪随机数和伪随机数生成器

    1. 几个问题 为什么需要随机数? 伪随机数伪在哪里? 为何要采用伪随机数代替随机数?这种代替是否有不利影响? 如何产生(伪)随机数? 以下内容将围绕这几个问题依次说明. 2. 参考 http://e ...

  7. 仿各种APP将文章DOM转JSON并在APP中以列表显示(android、ios、php已开源)

    背景 一直以来都想实现类似新闻客户端.鲜城等文章型app的正文显示,即在web editor下编辑后存为json,在app中解析json并显示正文. 网上搜过,没找到轮子.都是给的思路,然后告知是公司 ...

  8. [HDU5903]Square Distance(DP)

    题意:给一个字符串t ,求与这个序列刚好有m个位置字符不同的由两个相同的串拼接起来的字符串 s,要求字典序最小的答案. 分析:按照贪心的想法,肯定在前面让字母尽量小,尽可能的填a,但问题是不知道前面填 ...

  9. pat1057 stack

    超时算法,利用2的特殊性,用2个multiset来维护.单个multiset维护没法立即找到中位数. 其实也可以只用1个multiset,用一个中位指针,++,--来维护中位数. #include&l ...

  10. nginx location语法使用说明

    语法规则: location [=|~|~*|^~] /uri/ { … } = 开头表示精确匹配 ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可.nginx不对url做编码,因 ...