BZOJ3158: 千钧一发
【传送门:BZOJ3158】
简要题意:
给出n个机器,每个机器有a[i]基础值和b[i]价值
选出一部分机器使得这些机器里面两两至少满足以下两种条件之一:
1.a[i]2+a[j]2!=T2(T为正整数)
2.gcd(a[i],a[j])>1
求出能达到要求的最大价值
题解:
神最小割
要求一个最大价值,那么我们可以转换成求损失的价值最小
但是这里两个子集的分化并不明显
对于第二个要求,如果两点的a值都为偶数,那么肯定满足
那如果两个数都为奇数的话,也必定满足要求一,证明如下:
1、一个奇数的平方%4为1,一个偶数的平方%4为0
2、两个奇数的平方和%4为2
3、如果两个奇数的平方和是一个奇数的平方,那么%4应该为1,不符合
4、如果两个奇数的平方和是一个偶数的平方,那么%4应该为0,不符合
这样子思考的话,两个子集的分化就较为明显了:
st向a值为奇数的相连,a值为偶数的向ed相连,容量都为b值;
这样子所形成的两个子集里面的点一定都是符合要求的。
最后一步,也是最关键的一步:
两个子集之间两两匹配,如果当前匹配的两个点是不符合要求的,就将这两个点相连,容量为无限大。
跑最小割,割出来的边就是损失价值的最小值 用sum-最小割就是答案
by Cherish_OI
注意要加long long
参考代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
using namespace std;
typedef long long LL;
struct node
{
int x,y,next,other;LL c;
}a[];int len,last[];
void ins(int x,int y,LL c)
{
int k1=++len,k2=++len;
a[k1].x=x;a[k1].y=y;a[k1].c=c;
a[k1].next=last[x];last[x]=k1;
a[k2].x=y;a[k2].y=x;a[k2].c=;
a[k2].next=last[y];last[y]=k2;
a[k1].other=k2;
a[k2].other=k1;
}
int h[],list[],st,ed;
bool bt_h()
{
memset(h,,sizeof(h));h[st]=;
list[]=st;
int head=,tail=;
while(head!=tail)
{
int x=list[head];
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(a[k].c>&&h[y]==)
{
h[y]=h[x]+;
list[tail++]=y;
}
}
head++;
}
if(h[ed]==) return false;
else return true;
}
LL findflow(int x,LL f)
{
if(x==ed) return f;
int s=,t;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(a[k].c>&&h[y]==(h[x]+)&&f>s)
{
t=findflow(y,min(a[k].c,f-s));
s+=t;
a[k].c-=t;a[a[k].other].c+=t;
}
}
if(s==) h[x]=;
return s;
}
LL gcd(LL a,LL b)
{
if(a==) return b;
else return gcd(b%a,a);
}
LL A[],B[];
bool check(LL x,LL y)
{
LL c=sqrt(x*x+y*y);
if(c*c!=x*x+y*y) return false;
if(gcd(x,y)>) return false;
return true;
}
int main()
{
int n;
scanf("%d",&n);
st=;ed=n+;
len=;memset(last,,sizeof(last));
LL sum=;
for(int i=;i<=n;i++)
{
scanf("%lld",&A[i]);
sum+=A[i];
if(A[i]%==) ins(st,i,A[i]);
else ins(i,ed,A[i]);
}
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(check(A[i],A[j])==true&&(A[i]%==)&&(A[j]%==))
{
ins(i,j,);
}
}
}
while(bt_h()==true) sum-=findflow(st,);
printf("%lld\n",sum);
return ;
}
BZOJ3158: 千钧一发的更多相关文章
- BZOJ3158 千钧一发(最小割)
可以看做一些物品中某些互相排斥求最大价值.如果这是个二分图的话,就很容易用最小割了. 观察其给出的条件间是否有什么联系.如果两个数都是偶数,显然满足条件二:而若都是奇数,则满足条件一,因为式子列出来发 ...
- [bzoj3158]千钧一发——二分图+网络流
题目 传送门 题解 很容易建立模型,如果两个点不能匹配,那么连一条边,那么问题就转化为了求一个图上的最大点权独立集. 而我们可以知道: 最大点权独立集+最小点权覆盖集=总权值. 同时最小点权覆盖在一般 ...
- 【BZOJ3158】千钧一发 最小割
[BZOJ3158]千钧一发 Description Input 第一行一个正整数N. 第二行共包括N个正整数,第 个正整数表示Ai. 第三行共包括N个正整数,第 个正整数表示Bi. Output 共 ...
- 【bzoj3158】 千钧一发
http://www.lydsy.com/JudgeOnline/problem.php?id=3158 (题目链接) 题意 给出n个装置,每个装置i有一个特征值a[i]和一个能量值b[i],要求选出 ...
- bzoj3158&3275: 千钧一发(最小割)
3158: 千钧一发 题目:传送门 题解: 这是一道很好的题啊...极力推荐 细看题目:要求一个最大价值,那么我们可以转换成求损失的价值最小 那很明显就是最小割的经典题目啊?! 但是这里两个子集的分化 ...
- 【BZOJ-3275&3158】Number&千钧一发 最小割
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 748 Solved: 316[Submit][Status][Discus ...
- BZOJ 3158: 千钧一发
3158: 千钧一发 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1201 Solved: 446[Submit][Status][Discuss ...
- 【BZOJ】【3158】千钧一发
网络流/最小割 这题跟BZOJ 3275限制条件是一样的= =所以可以用相同的方法去做……只要把边的容量从a[i]改成b[i]就行了- (果然不加当前弧优化要略快一点) /************** ...
- bzoj 3158 千钧一发(最小割)
3158: 千钧一发 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 767 Solved: 290[Submit][Status][Discuss] ...
随机推荐
- How Javascript works (Javascript工作原理) (二) 引擎,运行时,如何在 V8 引擎中书写最优代码的 5 条小技巧
个人总结: 一个Javascript引擎由一个标准解释程序,或者即时编译器来实现. 解释器(Interpreter): 解释一行,执行一行. 编译器(Compiler): 全部编译成机器码,统一执行. ...
- NodeJS学习笔记 (1)资源压缩-zlib(ok)
原文: https://github.com/chyingp/nodejs-learning-guide/blob/master/README.md 自己的跟进学习: 概览 做过web性能优化的同学, ...
- (noip模拟十七)【BZOJ3930】[CQOI2015]选数-容斥水法
Description 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公 ...
- UNIX系统高级编程——第五章-标准I/O库-总结
基础: 标准I/O库在ANSI C中定义,可移植在不同的系统 文件指针(FILE):标准I/O库操作的不是文件描述符,而是流.FILE文件指针包含的是维护流所需的信息 通过函数fileno获取流的文件 ...
- Ruby创建命令
Ruby创建命令
- Swift学习笔记(二)——常量与变量
这篇博客将会学习到Swift中的常量Constants和变量Variable.这是学习语言的基础.当中能够看到Swift每句后面基本都是没有:分号的,假设有加:分号的习惯,也能够加上. (1)常量声明 ...
- bzoj1002: [FJOI2007]轮状病毒(基尔霍夫矩阵)
1002: [FJOI2007]轮状病毒 题目:传送门 题解: 决定开始板刷的第一题... 看到这题的时候想:这不就是求有多少种最小生成树的方式吗? 不会啊!!!%题解... 什么鬼?基尔霍夫矩阵?? ...
- nyoj--46--最少乘法次数(数学+技巧)
最少乘法次数 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 给你一个非零整数,让你求这个数的n次方,每次相乘的结果可以在后面使用,求至少需要多少次乘.如24:2*2=2 ...
- 【转】Android ClearEditText:输入用户名、密码错误时整体删除及输入为空时候晃动提示
1 package com.lixu.clearedittext; 2 3 4 import android.app.Activity; 5 import android.os.Bundle; 6 i ...
- CUDA笔记(九)
找了不知道多少教程,终于找到靠谱的nsight的: http://blog.csdn.net/mysniper11/article/details/8003644 还有两个视频的相关: http:// ...