[BZOJ2661][BeiJing wc2012]连连看 费用流
2661: [BeiJing wc2012]连连看
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 1349 Solved: 577
[Submit][Status][Discuss]
Description
凡是考智商的题里面总会有这么一种消除游戏。不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏。我们的规则是,给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y)的平方差x2-y2是一个完全平方数z2,并且y与z互质,那么就可以将x和y连起来并且将它们一起消除,同时得到x+y点分数。那么过关的要求就是,消除的数对尽可能多的前提下,得到足够的分数。快动手动笔算一算吧。
Input
只有一行,两个整数,分别表示a,b。
Output
两个数,可以消去的对数,及在此基础上能得到的最大分数。
Sample Input
Sample Output
HINT
对于30%的数据,1<=a,b<=100
对于100%的数据,1<=a,b<=1000
Source
拆点直接连边。跑最大费用最大流,答案/2。
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
struct data {
int cost,w,to,next;
}e[];
int head[],cnt;
int S,T;
void add(int u,int v,int w,int c) {
e[cnt].to=v;e[cnt].next=head[u];e[cnt].w=w;e[cnt].cost=c;head[u]=cnt++;
e[cnt].to=u;e[cnt].next=head[v];e[cnt].w=;e[cnt].cost=-c;head[v]=cnt++;
}
int dis[];
bool vis[];
int q[],used;
bool spfa() {
memset(dis,-,sizeof(dis));
vis[T]=;dis[T]=;
int h=,t=;
q[]=T;
while(h!=t) {
int now=q[h];h++;if(h==) h=;
for(int i=head[now];i>=;i=e[i].next) {
int to=e[i].to;if(!e[i^].w) continue;
if(dis[to]<dis[now]-e[i^].cost) {
dis[to]=dis[now]-e[i^].cost;
if(!vis[to]) {vis[to]=;q[t++]=to;if(t==)t=;}
}
}
vis[now]=;
}
used=-dis[S];
return dis[S]!=dis[];
}
int ans=;
int dfs(int x,int a) {
if(x==T) {ans+=used*a;return a;}
int f=,flow=;vis[x]=;
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;
if(!vis[to]&&e[i].w>&&dis[to]==dis[x]+e[i].cost&&(f=dfs(to,min(e[i].w,a)))) {
e[i].w-=f;e[i^].w+=f;
a-=f;flow+=f;
if(a==) break;
}
}
return flow;
}
void zkw() {
while(spfa()) {
do {
memset(vis,,sizeof(vis));
}while(dfs(S,));
memset(vis,,sizeof(vis));
}
}
bool check(int x,int y) {
int tmp=x*x-y*y,z=(int)sqrt(tmp);
if (z*z!=tmp) return false;
if (y<z) swap(y,z);
while (z){tmp=y%z;y=z;z=tmp;}
return (y==);
}
int main() {
memset(head,-,sizeof(head));
int a,b;
scanf("%d%d",&a,&b);
S=;T=;
for(int i=a;i<=b-;i++)
for(int j=i+;j<=b;j++) if (check(j,i)) {
add(i,j+,,-i-j);
add(j,i+,,-i-j);
}
for(int i=a;i<=b;i++) {
add(S,i,,);
add(i+,T,,);
}
zkw();
int tot=;
for(int i=;i<cnt;i++) if (e[i].to==T&&!e[i].w) tot++;
printf("%d %d\n",tot/,-ans/);
}
[BZOJ2661][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 ...
- 【费用流】bzoj2661 [BeiJing wc2012]连连看
将每个数拆点,互相连边,然后满足条件的数对之间互相连边,跑最大费用流,答案是流量和费用分别除以2. 一定要i->j.j->i都连上,否则可能会出现一个数在一边被选择了,在另一边的另一个匹配 ...
- 【BZOJ2661】[BeiJing wc2012]连连看 最大费用流
[BZOJ2661][BeiJing wc2012]连连看 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给 ...
- BZOJ_2661_[BeiJing wc2012]连连看_费用流
BZOJ_2661_[BeiJing wc2012]连连看_费用流 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规 ...
- [BeiJing wc2012]连连看
题目链接 费用流板子+拆点 #include <bits/stdc++.h> using namespace std; typedef long long ll; inline int r ...
- 【bzoj2661】[BeiJing wc2012]连连看 最大费用最大流
题目描述 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y ...
- [BeiJing wc2012]连连看(建模,最小费用最大流)
前言 突然发现自己在图论①被dalao吊着打... Solution 看到数据范围1000,感觉可以直接枚举连边,然后新建两个点就好了. 注意要拆点,不然可能会死循环(过来人) 代码实现 #inclu ...
- bzoj 2661: [BeiJing wc2012]连连看
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #inclu ...
随机推荐
- mysql 5.7 Access denied for user 'root'@'localhost' solution
sudo vim /etc/mysql/debian.cnf # Automatically generated for Debian scripts. DO NOT TOUCH! [client] ...
- bootsrap 上传插件fileinput 简单使用
1.安装 下载fileinput文件,载入对应的css+js文件,如下: <link href="css/bootstrap.min.css" rel="style ...
- 简述jq中attr()和prop()的区别
attr,prop都是属性的意思,那他们有什么区别呢?我们先来看一下jquery的部分源码: attr部分: attr: function( elem, name, value, pass ) { v ...
- java 利用反射完成自定义注解
元注解: 元注解的作用就是负责注解其他注解.Java5.0定义了4个标准的meta-annotation类型,它们被用来提供对其它 annotation类型作说明.Java5.0定义的元注解: 1.@ ...
- [luogu P1442] 铁球落地
题目链接 线段树\(+dp\). 先用线段树预处理出每个线段从左边和右边掉落到哪里,记为\(f[i][0/1]\). 然后记\(g[i][0/1]\)为到达第\(i\)个线段的左边或右边所要的最小时间 ...
- sqlplus 几个命令:
sqlplus 几个命令: 在sys,system,sysman,scott四个用户权限中,scott用户最低. 其权限依次从高到低. cmd进入sqlplus sqlplus 登录命令: 登录sys ...
- HDU4289:Control(最小割)
Control Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- HDU1272---(并查集)简单应用
http://acm.hdu.edu.cn/showproblem.php?pid=1272 小希的迷宫 Time Limit: 2000/1000 MS (Java/Others) Memor ...
- 图论:KM算法
如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就 ...
- 【BZOJ2002】【HNOI2010】弹飞绵羊 [分块]
弹飞绵羊 Time Limit: 10 Sec Memory Limit: 259 MB[Submit][Status][Discuss] Description 某天,Lostmonkey发明了一 ...