2661: [BeiJing wc2012]连连看

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

题解:

http://blog.csdn.net/aarongzk/article/details/50302219

code:

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define maxn 2005
 7 #define maxm 1000000
 8 #define inf 1061109567
 9 using namespace std;
10 char ch;
11 bool ok;
12 void read(int &x){
13     for (ok=0,ch=getchar();!isdigit(ch);ch=getchar()) if (ch==‘-‘) ok=1;
14     for (x=0;isdigit(ch);x=x*10+ch-‘0‘,ch=getchar());
15     if (ok) x=-x;
16 }
17 int a,b;
18 bool bo1[maxn],bo2[maxn],bo[maxn];
19 struct flow{
20     int s,t,tot,now[maxn],son[maxm],pre[maxm],val[maxm],cost[maxm];
21     int dis[maxn],head,tail,list[maxn],tmp,totflow,totcost;
22     bool bo[maxn];
23     void init(){s=0,t=(b<<1)+1,tot=1,memset(now,0,sizeof(now));}
24     void put(int a,int b,int c,int d){pre[++tot]=now[a],now[a]=tot,son[tot]=b,val[tot]=c,cost[tot]=d;}
25     void add(int a,int b,int c,int d){put(a,b,c,d),put(b,a,0,-d);}
26     void spfa(){
27         memset(bo,0,sizeof(bo));
28         memset(dis,63,sizeof(dis));
29         head=0,tail=1,list[1]=s,dis[s]=0,bo[s]=1;
30         while (head<tail){
31             if (++head==maxn) head=1;
32             int u=list[head];
33             for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])
34                 if (val[p]&&dis[v]>dis[u]+cost[p]){
35                     dis[v]=dis[u]+cost[p];
36                     if (!bo[v]){
37                         if (++tail==maxn) tail=1;
38                         list[tail]=v,bo[v]=1;
39                     }
40                 }
41             bo[u]=0;
42         }
43     }
44     int dfs(int u,int rest,int totval){
45         bo[u]=1;
46         if (u==t){totcost+=rest*totval;return rest;}
47         int ans=0;
48         for (int p=now[u],v=son[p];p&&rest;p=pre[p],v=son[p])
49             if (val[p]&&!bo[v]&&dis[v]==dis[u]+cost[p]){
50                 int d=dfs(v,min(rest,val[p]),totval+cost[p]);
51                 val[p]-=d,val[p^1]+=d,ans+=d,rest-=d;
52             }
53         return ans;
54     }
55     bool relax(){
56         int d=inf;
57         for (int u=s;u<=t;u++) if (bo[u])
58             for (int p=now[u],v=son[p];p;p=pre[p],v=son[p])
59                 if (val[p]&&!bo[v]) d=min(d,dis[u]+cost[p]-dis[v]);
60         if (d==inf) return false;
61         for (int u=s;u<=t;u++) if (!bo[u]) dis[u]+=d;
62         return true;
63     }
64     void work(){
65         spfa(),totflow=totcost=0;
66         do{
67             do{
68                 memset(bo,0,sizeof(bo));
69                 tmp=dfs(s,inf,0),totflow+=tmp;
70             }while (tmp);
71         }while (relax());
72     }
73 }f;
74 int main(){
75     read(a),read(b),f.init();
76     for (int i=a;i<=b;i++) for (int j=a;j<i;j++){
77         int t=round(sqrt(i*i-j*j));
78         if (t*t==i*i-j*j&&__gcd(j,t)==1) bo[i]=1,bo[j]=1,f.add(i,j+b,1,-i-j),f.add(j,i+b,1,-i-j);
79     }
80     for (int i=a;i<=b;i++) if (bo[i]) f.add(f.s,i,1,0);
81     for (int i=a;i<=b;i++) if (bo[i]) f.add(i+b,f.t,1,0);
82     f.work();
83     printf("%d %d\n",f.totflow>>1,(-f.totcost)>>1);
84     return 0;
85 }
时间: 2024-08-13 00:55:16

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*

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 只有一行,

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

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

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

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

bzoj2662 [BeiJing wc2012]冻结

2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 1007  Solved: 541[Submit][Status][Discuss] Description "我要成为魔法少女!"     "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中??"        在这个愿望被实现以后的世界里,人们享受着魔法卡片(Spe

分层图最短路(DP思想) BZOJ2662 [BeiJing wc2012]冻结

2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 999  Solved: 535[Submit][Status][Discuss] Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中??" 在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard,又名符 卡

BZOJ2659: [Beijing wc2012]算不出的算式

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

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

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