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 node
{
int u,v,next,cost,cap;
};
node edges[N*100];
int head[N],e;
void add(int u,int v,int cap,int cost)
{
edges[e].u=u;
edges[e].v=v;
edges[e].cap=cap;
edges[e].cost=cost;
edges[e].next=head[u];
head[u]=e++;
}
void Add(int u,int v,int cap,int cost)
{
add(u,v,cap,cost);
add(v,u,0,-cost);
}
int pre[N],F[N],C[N],visit[N];
int SPFA(int s,int t,int n)
{
int i;
for(i=0;i<=n;i++) F[i]=0,C[i]=INF*10000,visit[i]=0;
queue<int> Q;
Q.push(s); F[s]=INF; C[s]=0;
int u,v,cost,cap;
while(!Q.empty())
{
u=Q.front();
Q.pop();
visit[u]=0;
for(i=head[u];i!=-1;i=edges[i].next)
{
if(edges[i].cap>0)
{
v=edges[i].v;
cost=edges[i].cost;
cap=edges[i].cap;
if(C[v]>C[u]+cost)
{
C[v]=C[u]+cost;
F[v]=min(F[u],cap);
pre[v]=i;
if(!visit[v]) visit[v]=1,Q.push(v);
}
}
}
}
return F[t];
}
void MCMF(int s,int t,int n)
{
int i,x,temp,M=0;
int ans=0;
while(temp=SPFA(s,t,n))
{
M+=temp;
for(i=t;i!=s;i=edges[pre[i]].u)
{
x=pre[i];
ans+=edges[x].cost*temp;
edges[x].cap-=temp;
edges[x^1].cap+=temp;
}
}
PR(M>>1,(M*INF-ans)>>1);
}
int n,m,s,t,cnt;
int Gcd(int x,int y)
{
if(y==0) return x;
return Gcd(y,x%y);
}
int c[N*N],b[N],L[400],R[400];
int main()
{
RD(n,m);
if(n>m) swap(n,m);
int i,j,k;
for(i=1;i<=1000;i++) c[i*i]=i;
for(i=n;i<=m;i++) for(j=i+1;j<=m;j++)
{
k=j*j-i*i;
if(c[k]&&Gcd(i,c[k])==1)
{
b[i]=b[j]=1;
cnt++;
L[cnt]=i; R[cnt]=j;
}
}
int x=0;
for(i=n;i<=m;i++) if(b[i]) b[i]=++x;
s=0; t=x+x+1;
clr(head,-1);
for(i=n;i<=m;i++) if(b[i]) Add(s,b[i],1,0),Add(b[i]+x,t,1,0);
FOR1(i,cnt)
{
Add(b[L[i]],x+b[R[i]],1,INF-L[i]-R[i]);
Add(b[R[i]],x+b[L[i]],1,INF-L[i]-R[i]);
}
MCMF(s,t,t+1);
}
BZOJ 2661 连连看(费用流)的更多相关文章
- BZOJ 3130: [Sdoi2013]费用流 网络流 二分 最大流
https://www.lydsy.com/JudgeOnline/problem.php?id=3130 本来找费用流的题,权当复习一下网络流好了. 有点麻烦的是double,干脆判断大小或者二分增 ...
- BZOJ 1070 修车(费用流)
如果能想到费用流,这道题就是显然了. 要求所有人的等待平均时间最小,也就是所有人的总等待时间最小. 每辆车只需要修一次,所以s连每辆车容量为1,费用为0的边. 现在需要把每个人拆成n个点,把车和每个人 ...
- bzoj 1070 修车 —— 费用流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1070 需要考虑前面修的车对后面等待的车造成的时间增加: 其实可以从每个人修车的顺序考虑,如果 ...
- BZOJ 3130: [Sdoi2013]费用流 网络流+二分
3130: [Sdoi2013]费用流 Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 1230 Solved: ...
- BZOJ 2661: [BeiJing wc2012]连连看 费用流
2661: [BeiJing wc2012]连连看 Description 凡是考智商的题里面总会有这么一种消除游戏.不过现在面对的这关连连看可不是QQ游戏里那种考眼力的游戏.我们的规则是,给出一个闭 ...
- [BZOJ2661][BeiJing wc2012]连连看 费用流
2661: [BeiJing wc2012]连连看 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1349 Solved: 577[Submit][ ...
- bzoj 3130 [Sdoi2013]费用流(二分,最大流)
Description Alice和Bob在图论课程上学习了最大流和最小费用最大流的相关知识. 最大流问题:给定一张有向图表示运输网络,一个源点S和一个汇点T,每条边都有最大流量.一个合法的网络 ...
- bzoj 1283 序列 - 费用流
题目传送门 传送门 题目大意 给定一个长度为$n$的序列,要求选出一些数使得原序列中每$m$个连续的数中不超过$K$个被选走.问最大的可能的和. 感觉建图好妙啊.. 考虑把问题转化成选$m$次数,每次 ...
- BZOJ 2661 连连看
http://www.lydsy.com/JudgeOnline/problem.php?id=2661 思路:预处理出每个数字,然后若有x^2=y^2+z^2且z与y互质, s->x 1 ,0 ...
随机推荐
- Mysql子查询、关联查询
mysql中update.delete.install尽量不要使用子查询 一.mysql查询的五种子句 where(条件查询).having(筛选).group by(分组).orde ...
- 使用node-webkit开发exe窗口程序
首发:个人博客,更新&纠错&回复 ====关于原生程序与壳中程序的议论begin==== 在所有用户windows机器上都能直接跑的程序,如果不采用微软系的语言,如VB,C++,C#等 ...
- 视频处理控件TVideoGrabber如何对屏幕进行录制/压缩
TVideoGrabber可以对屏幕进行录制和压缩,本文来详细的说明在多种情况下TVideoGrabber是如何实现屏幕的录制和压缩. 屏幕录制 当VideoSource = vs_ScreenRec ...
- centos 6 7更改主机名 命令添加ip
6:vi /etc/sysconfig/network 中hostname =主机名 vi /etc/hosts 添加127.0.0.1相应的主机名 7: hostnamectl set-hostn ...
- 数据库订正脚本性能优化两则:去除不必要的查询和批量插入SQL
最近在做多数据库合并的脚本, 要将多个分数据库的表数据合并到一个主数据库中. 以下是我在编写数据订正脚本时犯过的错误, 记录以为鉴. 不必要的查询 请看以下语句: regiondb = db.Houy ...
- InnoDB Status Output – Buffer Pool and Spin Rounds
InnoDB has a good source of information about its status which can be requested every time you need ...
- stdout.read()与stdout.readlines()方法同时使用后果
stdout.read()与stdout.readlines()方法同时使用将无法导致最后使用的stdout.readlines()读取的内容为空,原因是首先调用的stdout.read()已将数据读 ...
- api-ms-win-crt-runtimel1-1-0.dll缺失的解决方案
api-ms-win-crt-runtime就是MFC的运行时环境的库, 在windows上编译也是用微软的visual studio C++编译的软件, 底层也会用到微软提供的C++库和runtim ...
- Environment中针对的读写权限判断
Android应用开发中,常使用Environment类去获取外部存储目录,在访问外部存储之前一定要先判断外部存储是否已经是可使用(已挂载&可使用)状态,并且需要在AndroidManifes ...
- 两个升序链表的合并 Merge Two Sorted Lists 【 leetcode】
class Solution {public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode *p; ListN ...