BZOJ 3308 毒瘤结论 网络流
结论:在答案集合中的数其质因数最多有两个 且有两个的话一个>n1/2一个<n1/2
这样我们就可以把所有质数筛出来 弄成二分图 左边是<n1/2右边是>n1/2的
所以先把单个质因子的答案全部加上 再考虑两个质因子的一个数会不会比一个质因子的两个数更优
如果更优 则建边 再求最大流
注意最后答案要加上特殊的1
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
typedef long long LL;
const int N=;
const int inf=0x7fffffff;
int n,val[N],cnt,prime[N],tot,last[N],s,t,dis[N],pre[N];
struct edge{int to,from,c,w,next;}e[N*];
queue <int> q;
bool not_prime[N],vis[N];
LL ans;
void get_prime(int n)
{
for (int i=;i<=n;i++)
{
if (!not_prime[i]) prime[++tot]=i;
for (int j=;j<=tot&&i*prime[j]<=n;j++)
{
not_prime[i*prime[j]]=;
if (i%prime[j]==) break;
}
}
} int get_val(int x,int y)
{
if (x*y>n) return ;
int w=x;
while ((LL)w*x*y<=(LL)n) w*=x;
return w*y;
} void addedge(int u,int v,int c,int w)
{
e[++cnt].from=u;e[cnt].to=v;e[cnt].c=c;e[cnt].w=w;e[cnt].next=last[u];last[u]=cnt;
e[++cnt].from=v;e[cnt].to=u;e[cnt].c=;e[cnt].w=-w;e[cnt].next=last[v];last[v]=cnt;
} bool spfa()
{
for (int i=s;i<=t;i++) dis[i]=-inf;
dis[s]=;vis[s]=;q.push(s);
while (!q.empty())
{
int u=q.front();q.pop();
for (int i=last[u];i;i=e[i].next)
if (e[i].c&&dis[u]+e[i].w>dis[e[i].to])
{
dis[e[i].to]=dis[u]+e[i].w;
pre[e[i].to]=i;
if (!vis[e[i].to]) q.push(e[i].to),vis[e[i].to]=;
}
vis[u]=;
}
if (dis[t]==-inf) return ;
else return ;
} void mcf()
{
if (dis[t]>) ans+=dis[t];
int x=t;
while (x!=s)
{
e[pre[x]].c--;
e[pre[x]^].c++;
x=e[pre[x]].from;
}
} int main()
{
scanf("%d",&n);
get_prime(n);
int w=sqrt(n);
while (prime[tot]>n/) ans+=prime[tot],tot--;
s=;t=tot+;cnt=;
for (int i=;i<=tot;i++)
{
ans+=val[i]=get_val(prime[i],);
if (prime[i]<=w) addedge(s,i,,);
else addedge(i,t,,);
}
for (int i=;i<=tot&&prime[i]<=w;i++)
for (int j=tot;j&&prime[j]>w;j--)
{
int v=get_val(prime[i],prime[j]);
if (v>val[i]+val[j]) addedge(i,j,,v-val[i]-val[j]);
}
while (spfa()) mcf();
printf("%lld",ans+);
return ;
}
BZOJ 3308 毒瘤结论 网络流的更多相关文章
- BZOJ 3144 [Hnoi2013]切糕 ——网络流
[题目分析] 网络流好题! 从割的方面来考虑问题往往会得到简化. 当割掉i,j,k时,必定附近的要割在k-D到k+D上. 所以只需要建两条inf的边来强制,如果割不掉强制范围内的时候,原来的边一定会换 ...
- bzoj 1066 : [SCOI2007]蜥蜴 网络流
题目链接 给一个n*m的图, 里面每一个点代表一个石柱, 石柱有一个高度. 初始时有些石柱上面有蜥蜴, 蜥蜴可以跳到距离他曼哈顿距离小于等于d的任意一个石柱上,跳完后, 他原来所在的石柱高度会减一, ...
- 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)
3308: 九月的咖啡店 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 244 Solved: 86 Description 深绘里在九份开了一家咖 ...
- bzoj 3308 九月的咖啡店
题目大意: 求若干个<=n的数 两两互质 使和最大 求这个最大的和 思路: 显然,得到两个结论 1 最终的所有数都只能分解为两个质因数 2 这两个质因数 一个<根号n 一个>根号n ...
- BZOJ 1443 二分图博弈 网络流
思路: 二分图博弈嘛 找到最大匹配的必须点 跑个网络流 前后DFS一遍 //By SiriusRen #include <queue> #include <cstdio> #i ...
- HDU 6735 结论网络流 机器人不重叠路径
我们可以得到一个结论:没有两个机器人走过的路会重叠 所以题目就转变为了能不能让机器人的路径不重叠且每个机器人能到达终点 直接一个点朝他四连通方向的四个点连容量为1的边即可 #include<bi ...
- Bzoj 1391: [Ceoi2008]order 网络流,最大权闭合图
1391: [Ceoi2008]order Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1105 Solved: 331[Submit][Statu ...
- BZOJ 1458: 士兵占领( 网络流 )
先判无解 把整个棋盘都放上士兵, 只需求最多可以拿走多少个士兵即可.每一行看做一个点r(i), 每一列看做一个点c(i) S->r(i), c(i)->T 连边, 容量为可以拿走的最大士兵 ...
- BZOJ 1391 [CEOI] Order - 网络流 最大流
Solution 非常简单的建边!!! 但是刚开始的代码不够体现社会主义的优越性, 于是我 .... 惨痛教训啊... 终于到了今天才能够体现社会主义优越性... Code #include<c ...
随机推荐
- 股票PE的应用
投资股票前,需要先分析公司,然后做估值.最后拿这估值对比现在它的现价,如果现价远低于估值,那就买入,因为这时候相当于打折价. 分析要怎么分析,估值要怎么估值 就像拿不同的旋头去维修不同的电器是一样的原 ...
- 使用Vue-Router的导航守卫-无限循环问题
我在项目里面用到了的是全局守卫,beforeEach,方便管理 不过遇到了一个问题,就是在beforeEach()中设置好判断条件后出现了无限循环的问题 当时的代码如下: router.beforeE ...
- 彻底理解js中this的指向,不必硬背(转)
转自: http://www.h5cn.com/js/jishu/2016/0226/18248.html 首先必须要说的是,this的指向在函数定义的时候是确定不了的,只有函数执行的时候才能确定th ...
- codevs1227:方格取数2
题目描述 Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= )现在从(,)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来,该 ...
- SCART概念
SCART(Syndicat des Constructeursd' Appareils Radiorécepteurs et Téléviseurs)接口是一种专用的音视频接口,它是由法国公司Per ...
- Lamda
- Python豆瓣源镜像
pip install pymysql -i http://pypi.douban.com/simple --trusted-host pypi.douban.com
- 笔记-4:mysql数据查询
1.创建查询表 1.1 创建班级表 含义 字段名 数据类型 宽度 班级编号 classNo 字符型 6 班级名称 className 字符型 20 所属院系 department 字符型 30 年级 ...
- 防止vi粘贴时自动添加缩进的方法
使用Xshell连接Linux服务器,使用vi打开文件进行粘贴时,会自动在行首添加很多空格,导致格式错乱.可以用如下方法剞劂 在拷贝前输入:set paste (这样的话,vim就不会启动自动缩进,而 ...
- 剑指offer(9)——用两个栈实现队列
题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能. 思路: 首先定义两个栈stack1. ...