3158: 千钧一发

Time Limit: 10 Sec  Memory Limit: 512 MB
Submit: 767  Solved: 290
[Submit][Status][Discuss]

Description

 

Input

第一行一个正整数N。

第二行共包括N个正整数,第 个正整数表示Ai。

第三行共包括N个正整数,第 个正整数表示Bi。

Output

共一行,包括一个正整数,表示在合法的选择条件下,可以获得的能量值总和的最大值。

Sample Input

4
3 4 5 12
9 8 30 9

Sample Output

39

HINT

1<=N<=1000,1<=Ai,Bi<=10^6

Source

【思路】

最小割。

注意到ai,aj同时是偶数或同时是奇数时必定可以被同时选出:

1 同为偶数满足条件2

2 同为奇数时有(2a+1)^2+(2b+1)^2=2(2a^2+2b^2+2a+2b+1),所以满足条件1。

以此构二分图,设奇数为X结点偶数为Y结点,如果不满足任一条件则连边(Xi,Yj,INF),同时相应连S到X,Y到T的边容量为b,那么答案就是一个二分图最小割,即通过删除一些结点使得满足剩下的结点不相邻且有b之和最小。

【代码】

 #include<cstdio>
#include<cmath>
#include<queue>
#include<cstring>
#include<iostream>
using namespace std; typedef long long LL;
const int maxn = +;
const int INF = 1e9+1e9; struct Edge{ int u,v,cap,flow;
}; struct Dinic {
int n,m,s,t;
int d[maxn],cur[maxn],vis[maxn];
vector<int> G[maxn];
vector<Edge> es; void init(int n) {
this->n=n;
for(int i=;i<n;i++) G[i].clear();
es.clear();
}
void AddEdge(int u,int v,int cap) {
es.push_back((Edge){u,v,cap,});
es.push_back((Edge){v,u,,});
m=es.size();
G[u].push_back(m-);
G[v].push_back(m-);
}
bool bfs() {
queue<int> q;
memset(vis,,sizeof(vis));
vis[s]=; d[s]=; q.push(s);
while(!q.empty()) {
int u=q.front(); q.pop();
for(int i=;i<G[u].size();i++) {
Edge &e=es[G[u][i]];
int v=e.v;
if(!vis[v] && e.cap>e.flow) {
vis[v]=;
d[v]=d[u]+;
q.push(v);
}
}
}
return vis[t];
}
int dfs(int u,int a) {
if(u==t || a==) return a;
int f,flow=;
for(int& i=cur[u];i<G[u].size();i++) {
Edge& e=es[G[u][i]];
int v=e.v;
if(d[v]==d[u]+ && (f=dfs(v,min(a,e.cap-e.flow)))>) {
e.flow+=f;
es[G[u][i]^].flow-=f;
flow+=f , a-=f;
if(!a) break;
}
}
return flow;
}
int maxflow(int s,int t) {
this->s=s , this->t=t;
int flow=;
while(bfs()) {
memset(cur,,sizeof(cur));
flow+=dfs(s,INF);
}
return flow;
}
} dc; int n;
int a[maxn],b[maxn]; bool issqr(LL x) { return sqrt(x)*sqrt(x) == x;
}
int gcd(int x,int y) {
return y==? x:gcd(y,x%y);
}
bool jud(LL x,LL y) {
LL t=x*x+y*y , sq=sqrt(t);
if(sq*sq!=t) return ;
if(gcd(x,y)>) return ;
return ;
} int main() {
scanf("%d",&n);
dc.init(n+);
int s=n,t=s+;
int ans=;
for(int i=;i<n;i++) scanf("%d",&a[i]);
for(int i=;i<n;i++) scanf("%d",&b[i]) , ans+=b[i];
for(int i=;i<n;i++)
if((a[i]&)) dc.AddEdge(s,i,b[i]);
else dc.AddEdge(i,t,b[i]);
for(int i=;i<n;i++) for(int j=;j<n;j++)
if((a[i]&) && (a[j]&)==)
if(!jud(a[i],a[j])) dc.AddEdge(i,j,INF);
ans-=dc.maxflow(s,t);
printf("%d",ans);
return ;
}

bzoj 3158 千钧一发(最小割)的更多相关文章

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

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

  2. BZOJ 3158 千钧一发 最小割

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

  3. 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) \)里面这个一定不是平方数因为除二后是 ...

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

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

  5. BZOJ 3158: 千钧一发

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

  6. bzoj 3158 千钧一发——网络流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3158 发现偶数之间一定满足第二个条件:奇数之间一定满足第一个条件 ( \( (2m+1)^{ ...

  7. spoj 839 OPTM - Optimal Marks&&bzoj 2400【最小割】

    因为是异或运算,所以考虑对每一位操作.对于所有已知mark的点,mark的当前位为1则连接(s,i,inf),否则连(i,t,inf),然后其他的边按照原图连(u,v,1),(v,u,1),跑最大流求 ...

  8. BZOJ 3158 千钧一发 (最大流->二分图带权最大独立集)

    题面:BZOJ传送门 和方格取数问题很像啊 但这道题不能像网格那样黑白染色构造二分图,所以考虑拆点建出二分图 我们容易找出数之间的互斥关系,在不能同时选的两个点之间连一条流量为$inf$的边 由于我们 ...

  9. bzoj 2229 [Zjoi2011]最小割(分治+最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2229 [题意] 回答若干个关于割不超过x的点对数目的询问. [思路] [最小割最多有n ...

随机推荐

  1. .net又一个生成缩略图的方法,不变形,非常好用

    生成缩略图是一个十分常用功能,找到了一个方法,重写部分代码,实用又好用,.net又一个生成缩略图的方法,不变形 /// <summary> /// 为图片生成缩略图 by 何问起 /// ...

  2. mac下开发环境常用操作与命令

    [1] 修改hosts文件 vim /private/etc/hosts

  3. Android平台的四大天王:Activity, Service, ContentProvider, BroadcastReceiver

    今天开始要自学android,刚看到百度知道上面这段话,觉得不错(不过已经是2011年8月的回答了): Android系统的手机的每一个你能看到的画面都是一个activity,它像是一个画布,随你在上 ...

  4. C#获取本机IP搜集整理7种方法

    今天打算试着写个小聊天程序,但是要用到获取本机IP,以前从没用过.摆渡百度了一会儿,出于贪心,想把各种获取本机IP的方法给找出来.摆渡+测试了几个小时,于是有了下面的成果,有点小累,但看到这些成果,也 ...

  5. 2016年9月ccf

    去长沙理工考ccf.恰好又可以见闺蜜. 前2道题很简单,第三题题目太长就跳过了[绕来绕去就像“你儿子是我儿子的爸爸一样头疼”],就做第四题.但是还有最后一个部分没写写好就到点了. 现在把它补充完整. ...

  6. 【POJ3468】【树状数组区间修改】A Simple Problem with Integers

    Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...

  7. iOS把两张图片合成一张图片

    0x00 步骤 先读取两张图片把创建出CGImageRef 创建上下文画布 把图片依次画在画布指定位置上 从上下文中获得合并后的图片 关闭上下文 释放内存 0x01 代码实现 - (void)comp ...

  8. UILongPressGestureRecognizer的selector多次调用解决方法

    当你使用longPress gesture recognizer 时,你可能会发现调用了多次. UILongPressGestureRecognizer *longPress = [[UILongPr ...

  9. dedecms 文章内容文章名字和文章网址的调用

    文章标题: <a href="{dede:field name='arcurl'/}">{dede:field.title/}</a> 本文章网址: < ...

  10. php获取https下的内容

    直接用file_get_contents,会报错: $url = ('https://xxx.com"); file_get_contents($url); 错误: Warning: fil ...