3158: 千钧一发

题目:传送门

题解:

   这是一道很好的题啊...极力推荐

   细看题目:要求一个最大价值,那么我们可以转换成求损失的价值最小

   那很明显就是最小割的经典题目啊?!

   但是这里两个子集的分化并不明显...GG

   耐心一点,从题目的要求再入手:

   对于第二个要求,如果两点的a值都为偶数,那么肯定满足

   那如果两个数都为奇数的话,也必定满足要求一,证明如下:

   1、一个奇数的平方%4为1,一个偶数的平方%4为0

   2、两个奇数的平方和%4为2

   3、如果两个奇数的平方和是一个奇数的平方,那么%4应该为1,不符合

   4、如果两个奇数的平方和是一个偶数的平方,那么%4应该为0,不符合

   因此得证。

   这样子思考的话,两个子集的分化就较为明显了:

   st向a值为奇数的相连,a值为偶数的向ed相连,容量都为b值;这样子所形成的两个子集里面的点一定都是符合要求的。

   最后一步,也是最关键的一步:

   两个子集之间两两匹配,如果当前匹配的两个点是不符合要求的,就将这两个点相连,容量为无限大。

   有什么用呢?自己画几个图便很容易理解:

   这时候我们跑最小割的话,割出来的边就是损失价值的最小值

   用sum-最小割就是答案啊

代码:

 #include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#define qread(x) x=read()
using namespace std;
typedef long long LL;
const LL inf=;
LL n,st,ed,sum;
LL A[],B[];
inline LL read()
{
LL f=,x=;char ch;
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return f*x;
}
struct node
{
LL x,y,c,next,other;
}a[];LL len,last[];
void ins(LL x,LL y,LL c)
{
int k1,k2;
k1=++len;
a[len].x=x;a[len].y=y;a[len].c=c;
a[len].next=last[x];last[x]=len; k2=++len;
a[len].x=y;a[len].y=x;a[len].c=;
a[len].next=last[y];last[y]=len; a[k1].other=k2;
a[k2].other=k1;
}
LL list[],h[],head,tail;
bool bt_h()
{
memset(h,,sizeof(h));h[st]=;
list[]=st;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(h[y]== && a[k].c)
{
h[y]=h[x]+;
list[tail++]=y;
}
}
head++;
}
if(h[ed])return true;
return false;
}
LL find_flow(LL x,LL flow)
{
if(x==ed)return flow;
LL s=,t;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(h[y]==h[x]+ && a[k].c> && flow>s)
{
s+=t=find_flow(y,min(a[k].c,flow-s));
a[k].c-=t;a[a[k].other].c+=t;
}
}
if(s==)h[x]=;
return s;
}
LL gcd(LL a,LL b)
{
return a==?b:gcd(b%a,a);
}
bool pd(LL x,LL y)
{
LL T=x*x+y*y,t=sqrt(T);
if(t*t!=T)return true;
if(gcd(x,y)>)return true;
return false;
}
int main()
{
sum=;
qread(n);
len=;memset(last,,sizeof(last));
for(int i=;i<=n;i++)qread(A[i]);
for(int i=;i<=n;i++){qread(B[i]);sum+=B[i];}
st=n+;ed=st+;
for(int i=;i<=n;i++)
{
if(A[i]%==)ins(st,i,B[i]);
else ins(i,ed,B[i]);
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if((A[i]%==) && (A[j]%==) && !pd(A[i],A[j]))
ins(i,j,inf);
LL ans=;
while(bt_h())ans+=find_flow(st,inf);
printf("%lld\n",sum-ans);
return ;
}

bzoj3158&3275: 千钧一发(最小割)的更多相关文章

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

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

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

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

  3. bzoj 3158 千钧一发 —— 最小割

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 \( a[i] \) 是奇数则满足条件1,是偶数则显然满足条件2: 因为如果把两个奇数 ...

  4. BZOJ 3158 千钧一发 最小割

    分析: 偶数对满足条件2,所有奇数对满足条件1. 如果你能一眼看出这个规律,这道题就完成了一半. 我们只需要将数分为两类,a值为奇数,就从S向这个点连容量为b值的边,a值为偶数,就从这个点向T连容量为 ...

  5. BZOJ 3275: Number( 最小割 )

    S->每个奇数,每个偶数->T各连一条边, 容量为这个数字.然后不能同时选的两个数连容量为+oo的边. 总数-最大流即是答案. 因为满足a2+b2=c2的a,b一定是一奇一偶或者两个偶数, ...

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

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

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

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

  8. bzoj 3275 Number(最小割)

    [题意] 给定n个数,要求选出一些数满足 1.存在c,a*a+b*b=c*c 2.gcd(a,b)=1  使得和最大. [思路] 二分图的最大权独立集(可以这么叫么QAQ 先拆点,对于不满足条件的两个 ...

  9. bzoj 3158: 千钧一发【最小割】

    这个条件非常妙啊,奇数和奇数一定满足1,因为\( (2a+1)^2+(2b+1)^2=4a^2+4a+4b^2+4b+2=2(2(a^2+a+b^2+b)+1) \)里面这个一定不是平方数因为除二后是 ...

随机推荐

  1. UVALive 5545 Glass Beads

    Glass Beads Time Limit: 3000ms Memory Limit: 131072KB This problem will be judged on UVALive. Origin ...

  2. SQL SERVER-安装和卸载

    卸载后无法正常安装SQL SERVER 删除了本机的SQL SERVER以后,我发现我本机的SQL SERVER 再也安装不上了,这个一个比较严重的问题,要每天定时备份数据库到指定的地方才能防止数据丢 ...

  3. CSS学习(四)

    伪类(Pseudo-classes) CSS伪类是用来添加一些选择器的特殊效果. 伪类的语法: selector:pseudo-class {property:value;} CSS类也可以使用伪类: ...

  4. org.hibernate.AssertionFailure: null id in com.you.model.User entry (don&#39;t flush the Session after a

    1.错误描写叙述 org.hibernate.AssertionFailure: null id in com.you.model.User entry (don't flush the Sessio ...

  5. composer是什么

    composer是什么 Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们.Composer 不是一个包管理器.是的,它涉及 &q ...

  6. ES不设置副本是非常脆弱的,整个文章告诉了你为什么

    Delaying Shard Allocation As discussed way back in Scale Horizontally, Elasticsearch will automatica ...

  7. Homebrew的安装及使用

    Homebrew是Mac上的软件包管理工具,能在Mac中方便的搜索安装卸载软件. 1  安装 在终端输入一下代码,回车,即可下载. ruby -e "$(curl -fsSL https:/ ...

  8. SpringCloud学习笔记(11)----Spring Cloud Netflix之Hystrix断路器的使用

    为什么会有断路器? 在微服务架构中,系 是拆分成 一个的服务单元各间通过注册与发现 的方式互相依 赖.每个单元都在不同的进程中运行, 都是通过远程调用的方式进行信 ,这样就有可能因为网络原或 是依赖服 ...

  9. webkit Safari的样式库

    1,webkit Box模型 CSS定义:-webkit-border-bottom-left-radius: radius; CSS定义:-webkit-border-top-left-radius ...

  10. linux上使用chrome自动化测试(无界面)

    selenium自动化测试主要是用于有图形界面的系统上,对于无图形界面的情况可以通过以下方法来实现 服务器信息 [root@spider01 ~]# hostnamectl Static hostna ...