BZOJ 2661: [BeiJing wc2012]连连看(简单费用流)
来源:互联网 发布:关闭淘宝客推广计划 编辑:程序博客网 时间:2024/04/29 10:56
2661: [BeiJing wc2012]连连看
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 825 Solved: 305
[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
1 15
Sample Output
2 34
HINT
对于30%的数据,1<=a,b<=100
对于100%的数据,1<=a,b<=1000
解题思路:
拆点,简单费用流。
/************************************************************** Problem: 2661 User: mogu Language: C++ Result: Accepted Time:128 ms Memory:16960 kb****************************************************************/ #include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <vector>#include <queue>#include <set>#include <map>#include <cmath>#include <algorithm>#define LL long long using namespace std;const int MAXN = 4000 + 20;const int MAXM = 800000 + 40;const int INF = 0x7fffffff;struct Edge{ int to, next, cap, flow, cost;}edge[MAXM];int head[MAXN], tot, pre[MAXN], dis[MAXN];bool vis[MAXN];int N;int read(){ int x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9'){if(ch == '-') f *= -1; ch = getchar();} while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();} return x * f;}void init(){ tot = 0; memset(head, -1, sizeof(head));}void addedge(int u, int v, int cap, int cost){ edge[tot].to = v; edge[tot].cap = cap; edge[tot].cost = cost; edge[tot].flow = 0; edge[tot].next = head[u];head[u] = tot++; edge[tot].to = u; edge[tot].cap = 0; edge[tot].cost = -cost; edge[tot].flow = 0; edge[tot].next = head[v]; head[v] = tot++;}bool spfa(int s, int t){ queue<int>q; for(int i=0;i<N;i++) { dis[i] = INF; vis[i] = false; pre[i] = -1; } dis[s] = 0; vis[s] = true; q.push(s); while(!q.empty()) { int u = q.front(); q.pop();vis[u] = false; for(int i=head[u];i!=-1;i=edge[i].next) { int v = edge[i].to; if(edge[i].cap > edge[i].flow && dis[v] > dis[u] + edge[i].cost) { dis[v] = dis[u] + edge[i].cost; pre[v] = i; if(!vis[v]) { vis[v] = true; q.push(v); } } } } if(pre[t] == -1) return false; else return true;}int mincostmaxflow(int s, int t, long long &cost){ int flow = 0; cost = 0; while(spfa(s, t)) { int Min = INF; for(int i=pre[t];i!=-1;i=pre[edge[i^1].to]) { if(Min > edge[i].cap - edge[i].flow) Min = edge[i].cap - edge[i].flow; } for(int i=pre[t];i!=-1;i=pre[edge[i^1].to]) { edge[i].flow += Min; edge[i^1].flow -= Min; cost += edge[i].cost * Min; } flow += Min; } return flow;}int a, b;int gcd(int x, int y){return y == 0 ? x : gcd(y, x % y);}bool check(int x, int y){ int t = int(sqrt(x * x - y * y)); if(t * t != x * x - y * y) return false; if(gcd(y, t) != 1) return false; return true;}int main(){ scanf("%d%d", &a, &b); init();N = 2 * b + 2; int s = 0, t = N - 1; for(int i=a;i<=b;i++) { for(int j=a;j<i;j++) { if(check(i, j)) { addedge(i, j + b, 1, -i - j); addedge(j, i + b, 1, -i - j); } } } for(int i=a;i<=b;i++) addedge(s, i, 1, 0); for(int i=a;i<=b;i++) addedge(i + b, t, 1, 0); long long cost = 0; int ans = mincostmaxflow(s, t, cost); cout << ans / 2<< ' ' << (-cost) / 2 << endl; return 0;}
0 0
- BZOJ 2661: [BeiJing wc2012]连连看(简单费用流)
- 【 bzoj 2661 】 [BeiJing wc2012]连连看 - 拆点费用流
- [BZOJ]2661: [BeiJing wc2012]连连看 费用流
- 【bzoj2661】【BeiJing wc2012】【连连看】【费用流】
- bzoj2661 [BeiJing wc2012]连连看(拆点费用流)
- 2661: [BeiJing wc2012]连连看
- BZOJ【bzoj2661】[BeiJing wc2012]连连看
- BZOJ P2661[BeiJing wc2012]连连看
- bzoj2661:[BeiJing wc2012]连连看——费用流 + 拆点
- 【BeiJing wc2012】【BZOJ2661】连连看
- BZOJ2661 / wc2012 连连看【费用流】
- BZOJ 2662 BeiJing wc2012 冻结
- bzoj 2662: [BeiJing wc2012]冻结
- bzoj 2662: [BeiJing wc2012]冻结
- bzoj 2662: [BeiJing wc2012]冻结
- bzoj 2662: [BeiJing wc2012]冻结
- BZOJ-3171 && 2661 循环格&&连连看 最小费用最大流
- bzoj 2659: [Beijing wc2012]算不出的算式
- Android studio 打jar包带资源ID名称,可作为SDK用途
- mac下配置eclipse的hadoop环境
- PackageManager详解
- 函数重载
- 实用js代码
- BZOJ 2661: [BeiJing wc2012]连连看(简单费用流)
- Objective-C:神在细节之中
- ns3 dce error
- 手势是由基本事件构成(郭挺)
- 15个必须知道的chrome开发者技巧
- opencv2.4.9中ann_mlp.cpp学习
- Android学习(二)
- 机器学习笔记_回归_4: 最小二乘问题(2)
- A hard puzzle