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*M],v[10*M],w[10*M],fro[10*M],fr[M];
 10 int ans,sum;
 11 void jia1(int a1,int a2,int a3,int a4)
 12 {
 13     cnt++;
 14     next[cnt]=head[a1];
 15     head[a1]=cnt;
 16     fro[cnt]=a1;
 17     u[cnt]=a2;
 18     v[cnt]=a3;
 19     w[cnt]=a4;
 20 }
 21 void jia(int a1,int a2,int a3,int a4)
 22 {
 23     jia1(a1,a2,a3,a4);
 24     jia1(a2,a1,0,-a4);
 25     return;
 26 }
 27 bool spfa()
 28 {
 29     memset(d,127,sizeof(int)*(T+1));
 30     d[0]=0;
 31     f[0]=1;
 32     q[1]=0;
 33     int h=0,t=1;
 34     for(;h<t;)
 35       {
 36         h++;
 37         int p=q[h];
 38         f[p]=0;
 39           for(int i=head[p];i;i=next[i])
 40           if(v[i]&&d[u[i]]>d[p]+w[i])
 41             {
 42                 d[u[i]]=d[p]+w[i];
 43                 fr[u[i]]=i;
 44                 if(!f[u[i]])
 45                   {
 46                     f[u[i]]=1;
 47                     t++;
 48                     q[t]=u[i];
 49                     }
 50             }
 51       }
 52     if(d[T]!=inf)
 53       return 1;
 54     return 0;
 55 }
 56 void mcf()
 57 {
 58     int mx=inf;
 59     for(int i=fr[T];i;i=fr[fro[i]])
 60       mx=min(mx,v[i]);
 61     for(int i=fr[T];i;i=fr[fro[i]])
 62       {
 63         v[i]-=mx;
 64         v[i^1]+=mx;
 65         ans+=mx*w[i];
 66       }
 67     sum+=mx;
 68     return;
 69 }
 70 int gcd(int a1,int a2)
 71 {
 72     int a3=a1%a2;
 73     for(;a3;)
 74       {
 75         a1=a2;
 76         a2=a3;
 77         a3=a1%a2;
 78       }
 79     return a2;
 80 }
 81 int main()
 82 {
 83     scanf("%d%d",&n,&m);
 84     T=2001;
 85     for(int i=n;i<=m;i++)
 86       {
 87         jia(0,i,1,0);
 88         jia(i+1000,T,1,0);
 89       }
 90     for(int i=n;i<=m;i++)
 91       for(int j=n;j<i;j++)
 92         {
 93             double a1=sqrt(i*i-j*j);
 94             int a2=floor(a1);
 95             if(a2==a1&&gcd(a2,j)==1)
 96               {
 97                 jia(i,j+1000,1,-i-j);
 98                 jia(j,i+1000,1,-i-j);
 99               }
100         }
101     for(;spfa();)
102       mcf();
103     printf("%d %d\n",sum/2,-ans/2);
104     return 0;
105 }

网络流如果满足条件,x向y‘连费用为z的边,y向x’连费用为z的边,最后除2便是答案。

时间: 2024-08-07 00:14:52

bzoj 2661: [BeiJing wc2012]连连看的相关文章

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】【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 #incl

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