【BZOJ】【2661】【Beijing WC2012】连连看

网络流/费用流/二分图最大权匹配



  拆点费用流求最大权匹配……妈蛋BZOJ上是数据出错了吗?为什么我拿zyf和Hzwer的代码也交不过去……害我白白WA了那么多次

 1 //BZOJ 2661
 2 #include<cmath>
 3 #include<vector>
 4 #include<cstdio>
 5 #include<cstring>
 6 #include<cstdlib>
 7 #include<iostream>
 8 #include<algorithm>
 9 #define rep(i,n) for(int i=0;i<n;++i)
10 #define F(i,j,n) for(int i=j;i<=n;++i)
11 #define D(i,j,n) for(int i=j;i>=n;--i)
12 #define pb push_back
13 using namespace std;
14 inline int getint(){
15     int v=0,sign=1; char ch=getchar();
16     while(ch<‘0‘||ch>‘9‘){ if (ch==‘-‘) sign=-1; ch=getchar();}
17     while(ch>=‘0‘&&ch<=‘9‘){ v=v*10+ch-‘0‘; ch=getchar();}
18     return v*sign;
19 }
20 const int N=2010,M=2000000,INF=~0u>>2;
21 typedef long long LL;
22 /******************tamplate*********************/
23 int n,m,a,b,ans,flow;
24 inline int gcd(int a,int b){return b ? gcd(b,a%b) : a;}
25 bool judge(int x,int y){
26     int q=x*x-y*y,s=sqrt(q);
27     if (s*s==q && gcd(y,s)==1) return 1;
28     return 0;
29 }
30 struct edge{int from,to,v,c;};
31 struct Net{
32     edge E[M];
33     int head[N],next[M],cnt;
34     void ins(int x,int y,int z,int c){
35         E[++cnt]=(edge){x,y,z,c};
36         next[cnt]=head[x]; head[x]=cnt;
37     }
38     void add(int x,int y,int z,int c){
39         ins(x,y,z,c); ins(y,x,0,-c);
40     }
41     int from[N],Q[M],d[N],S,T;
42     bool inq[N];
43     bool spfa(){
44         int l=0,r=-1;
45         F(i,0,T) d[i]=INF;
46         d[S]=0; Q[++r]=S; inq[S]=1;
47         while(l<=r){
48             int x=Q[l++];
49             inq[x]=0;
50             for(int i=head[x];i;i=next[i])
51                 if(E[i].v>0 && d[x]+E[i].c<d[E[i].to]){
52                     d[E[i].to]=d[x]+E[i].c;
53                     from[E[i].to]=i;
54                     if (!inq[E[i].to]){
55                         Q[++r]=E[i].to;
56                         inq[E[i].to]=1;
57                     }
58                 }
59         }
60         return d[T]!=INF;
61     }
62     void mcf(){
63         int x=INF,y,z;
64         for(int i=from[T];i;i=from[E[i].from]){
65 //            if (E[i].from==S) y=E[i].to;
66 //            if (E[i].to==T) z=E[i].from-b;
67             x=min(x,E[i].v);
68         }
69         for(int i=from[T];i;i=from[E[i].from]){
70             E[i].v-=x;
71             E[i^1].v+=x;
72         }
73         flow+=x;
74         ans+=x*d[T];
75     }
76     void init(){
77         scanf("%d%d",&a,&b);
78         cnt=1; S=0; T=2001;
79         F(i,a,b){
80             add(S,i,1,0);
81             add(i+b,T,1,0);
82             F(j,a,i-1)
83                 if(judge(i,j)) add(i,j+b,1,-i-j);
84         }
85         while(spfa()) mcf();
86         printf("%d %d",flow,-ans);
87     }
88 }G1;
89
90 int main(){
91 #ifndef ONLINE_JUDGE
92     freopen("2661.in","r",stdin);
93     freopen("2661.out","w",stdout);
94 #endif
95     G1.init();
96     return 0;
97 }

时间: 2024-08-04 16:02:27

【BZOJ】【2661】【Beijing WC2012】连连看的相关文章

bzoj 2661: [BeiJing wc2012]连连看

1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<cmath> 5 #include<algorithm> 6 #define M 10000 7 #define inf 2139062143 8 using namespace std; 9 int cnt=1,n,m,T,d[M],q[2*M],f[M],head[M],next[10*M],u[10*

2661: [BeiJing wc2012]连连看

Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y)的平方差x2-y2是一个完全平方数z2,并且y与z互质,那么就可以将x和y连起来并且将它们一起消除,同时得到x+y点分数.那么过关的要求就是,消除的数对尽可能多的前提下,得到足够的分数.快动手动笔算一算吧. Input 只有一行,两个整数,分别表示a,b. Output 两个数,可以消去的

bzoj2661[BeiJing wc2012]连连看

bzoj2661[BeiJing wc2012]连连看 题意: 给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y)的平方差x2-y2是一个完全平方数z2,并且y与z互质,那么就可以将x和y一起消除,同时得到x+y点分数.求消除的数对尽可能多的前提下分数的最大值. 题解: 每个数拆成两个点,s和左侧点连流量为1,费用为0的边:右侧点和t连流量为1,费用为0的边.如果i,j合法,则同时向左侧i向右侧j及左侧j向右侧i连流量为1,费用为i+j的边.这道题和bzoj4514不同,因

【BZOJ2661】[BeiJing wc2012]连连看 最大费用流

[BZOJ2661][BeiJing wc2012]连连看 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y)的平方差x2-y2是一个完全平方数z2,并且y与z互质,那么就可以将x和y连起来并且将它们一起消除,同时得到x+y点分数.那么过关的要求就是,消除的数对尽可能多的前提下,得到足够的分数.快动手动笔算一算吧. Input 只有一行,

BZOJ 2659[Beijing wc2012]算不出的算式

题面: 2659: [Beijing wc2012]算不出的算式 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1421  Solved: 839[Submit][Status][Discuss] Description 算不出的算式背景:曾经有一个老掉牙的游戏放在我面前,我没有珍惜.直到这个游戏停产才追悔莫及.人世间最痛苦的事情莫过于此,如果上天给我一个再玩一次的机会,我一定要,通关!题目描述:如果你真的很想玩这个游戏,那么就先看看我的题目吧,搞

BZOJ 2662: [BeiJing wc2012]冻结(最短路)

这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. -------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #inclu

【bzoj2661】[BeiJing wc2012]连连看 最大费用最大流

题目描述 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y)的平方差x2-y2是一个完全平方数z2,并且y与z互质,那么就可以将x和y连起来并且将它们一起消除,同时得到x+y点分数.那么过关的要求就是,消除的数对尽可能多的前提下,得到足够的分数.快动手动笔算一算吧. 输入 只有一行,两个整数,分别表示a,b. 输出 两个数,可以消去的对数,及在此基础上能得到的最

bzoj 2660: [Beijing wc2012]最多的方案【dp】

有点神奇的dp 首先注意到任意一个数都能被表示成若干个斐波那契数的和的形式 先求出n可以字典序最大的表示 设f[i][0/1]表示第i个斐波那契数选或者不选 如果当前数不选,那就选比他小的两个数,否则,需要不选比他小的两个数(连续的影响) #include<iostream> #include<cstdio> using namespace std; const int N=105; long long n,a[N],s[N],top,f[N][2]; int main() { s

BZOJ 2661 连连看(费用流)

题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2661 题意:给出一个区间[a,b]中的全部整数,如果其中某两个数x,y(设x>y)的平方差x^2-y^2是一个完全平方数z^2,并且y与z互质,那么就可以将x和y一起消除,同时得到x+y点分数.要求就是,消除的数对尽可能多的前提下,得到的分数尽量多. 思路:首先暴力出所有合法的数对(x,y).然后将每个用到的数字拆成两个点,每个数对连一条边.最后的答案除以2即可. struct nod