[BeiJing wc2012]连连看
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} /********************************************************************/ struct ZKM_MinCostMaxFlow{
const static int maxn = 1e5+;
const static int maxE = 1e5+;
const static int INF = 0xfffffff; struct Edge{
int to, next, cap, flow, cost;
Edge(int _to = , int _next = , int _cap = , int _flow = , int _cost = ):
to(_to), next(_next), cap(_cap), flow(_flow), cost(_cost){}
}edge[maxE*]; int head[maxn], tot;
int cur[maxn], dis[maxn];
bool vis[maxn];
int ss, tt, N;
int min_cost, max_flow;
void init(int N){
tot = ;
for(int i = ;i < N;i++) head[i] = -;
}
int addedge(int u, int v, int cap, int cost){
edge[tot] = Edge(v, head[u], cap, , cost);
int rs = tot;
head[u] = tot++;
edge[tot] = Edge(u, head[v], , , -cost);
head[v] = tot++;
return rs;
}
int aug(int u, int flow){
if(u == tt) return flow;
vis[u] = true;
for(int i = cur[u];i != -;i = edge[i].next){
int v = edge[i].to;
if(edge[i].cap > edge[i].flow && !vis[v] && dis[u] == dis[v] + edge[i].cost){
int tmp = aug(v, min(flow, edge[i].cap - edge[i].flow));
edge[i].flow += tmp;
edge[i^].flow -= tmp;
cur[u] = i;
if(tmp) return tmp;
}
}
return ;
}
bool modify_label(){
int d = INF;
for(int u = ;u < N;u++){
if(vis[u]){
for(int i = head[u];i != -;i = edge[i].next){
int v = edge[i].to;
if(edge[i].cap > edge[i].flow && !vis[v]){
d = min(d, dis[v]+edge[i].cost - dis[u]);
}
}
}
}
if(d == INF) return false;
for(int i = ;i < N;i++){
if(vis[i]){
vis[i] = false;
dis[i] += d;
}
}
return true;
} pair<int, int> mincostmaxflow(int start, int ed, int n){
ss = start, tt = ed, N = n;
min_cost = max_flow = ;
for(int i = ;i < n;i++) dis[i] = ;
while(){
for(int i = ;i < n;i++) cur[i] = head[i];
while(){
for(int i = ;i < n;i++) vis[i] = false;
int tmp = aug(ss, INF);
if(tmp == ) break;
max_flow += tmp;
min_cost += tmp*dis[ss];
}
if(!modify_label()) break;
}
return make_pair( max_flow, min_cost );
}
}solver; int gcd(int x, int y){
if(y == ) return x;
else return gcd(y, x%y);
} bool check(int x, int y){
if(x == y) return false;
if(x < y) swap(x, y);
int t = sqrt(x*x-y*y);
if(t*t != x*x-y*y) return false;
if(gcd(y, t) != ) return false;
return true;
} int main(){
int a, b;
a = read(); b = read();
solver.init(b*+);
for(int i = a;i <= b;i++){
for(int j = a;j <= b;j++){
if(check(i, j)){
solver.addedge(i, j+b, , -i-j);
}
}
solver.addedge(b*+, i, , ); //拆点
solver.addedge(i+b, b*+, , ); //拆点
}
pair<int, int> ans = solver.mincostmaxflow(b*+, b*+, b*+);
printf("%d %d\n", ans.first/, -ans.second/);
return ;
}
[BeiJing wc2012]连连看的更多相关文章
- BZOJ 2661: [BeiJing wc2012]连连看 费用流
2661: [BeiJing wc2012]连连看 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭 ...
- BZOJ2661: [BeiJing wc2012]连连看
2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 483 Solved: 200[Submit][S ...
- BZOJ_2661_[BeiJing wc2012]连连看_费用流
BZOJ_2661_[BeiJing wc2012]连连看_费用流 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规 ...
- 【BZOJ2661】[BeiJing wc2012]连连看 最大费用流
[BZOJ2661][BeiJing wc2012]连连看 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给 ...
- [BZOJ2661][BeiJing wc2012]连连看 费用流
2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1349 Solved: 577[Submit][ ...
- 2661: [BeiJing wc2012]连连看
Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y( ...
- 【bzoj2661】[BeiJing wc2012]连连看 最大费用最大流
题目描述 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y ...
- bzoj 2661: [BeiJing wc2012]连连看
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...
- [BeiJing wc2012]连连看(建模,最小费用最大流)
前言 突然发现自己在图论①被dalao吊着打... Solution 看到数据范围1000,感觉可以直接枚举连边,然后新建两个点就好了. 注意要拆点,不然可能会死循环(过来人) 代码实现 #inclu ...
- 【费用流】bzoj2661 [BeiJing wc2012]连连看
将每个数拆点,互相连边,然后满足条件的数对之间互相连边,跑最大费用流,答案是流量和费用分别除以2. 一定要i->j.j->i都连上,否则可能会出现一个数在一边被选择了,在另一边的另一个匹配 ...
随机推荐
- android 电池(一):锂电池基本原理篇【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/8497830 关键词:Android 电池关机充电 androidboot.mode ...
- BZOJ 1600 [Usaco2008 Oct]建造栅栏:dp【前缀和优化】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1600 题意: 给你一个长度为n的木板,让你把这个木板切割成四段(长度为整数),并且要求这四 ...
- B1/B2签证的有效期——对于B1/B2签证,停留期最长不超过183天
一.关于签证有效期首先我们要知道当我们历经困难从签证官手里拿到自己的签证的时候,签证上面有个时间这个我们叫做签证有效期.B1/B2一般是一年多次往返的,这个只跟你申请的签证类型有关,与你填表的时候写的 ...
- div img 垂直水平居中
<style> div { width: 600px; height: 578px; text-align: center; display: table-cell; vertical-a ...
- 网络编程学习笔记-linux常用的网络命令
网络参数设置命令 所有时刻如果你想要做好自己的网络参数设置,包括IP参数.路由参数和无线网络等,就得要了解下面这些相关的命令才行.其中Route及ip这两条命令是比较重要的.当然,比较早期的用法,我们 ...
- hdfs 查看报告--命令(hdfs dfsadmin -report)
[hadoop@master sbin]$ hdfs dfsadmin -reportConfigured Capacity: 8202977280 (7.64 GB)Present Capacity ...
- Java命名规范(简略)
1.包 全部小写,由域名定义前缀. 例如:teach.golddrem.javagroup 2.类 开头字母大写,后边每个单词的首字母都大写.如果有缩写,缩写部分全部大写. 例如:Informatio ...
- MongoDB 分片的原理、搭建、应用 !
MongoDB 分片的原理.搭建.应用 一.概念: 分片(sharding)是指将数据库拆分,将其分散在不同的机器上的过程.将数据分散到不同的机器上,不需要功能强大的服务器就可以存储更多的数据和处 ...
- 百度地图API的第一次接触
因为项目的需求,第一次接触了百度API. 第一步:引用百度地图API的脚本 如果在局域网环境中,要把地图文件和js文件都要下载下来 <script type="text/javascr ...
- 用位运算实现四则运算之加减乘除(用位运算求一个数的1/3) via Hackbuteer1
转自:http://blog.csdn.net/hackbuteer1/article/details/7390093 ^: 按位异或:&:按位与: | :按位或 计算机系统中,数值一律用补码 ...