题目大意:

求若干个<=n的数 两两互质 使和最大 求这个最大的和

思路:

显然,得到两个结论

1 最终的所有数都只能分解为两个质因数

2 这两个质因数 一个<根号n 一个>根号n

于是可以建立二分图,按照数值是否大于根号n分为两个集合

把每个点不大于n的最大次幂加入答案

对于每两个所属集合不同的点,判断他们两个对答案的贡献是否大于两个独立对答案的贡献

如果是,就连边 跑最大费用流

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<queue>
#include<map>
#include<vector>
#define ll long long
#define inf 2139062143
#define MAXN 200100
#define MAXM 1000100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,ntp[MAXN],p[MAXN],tot,ans,q1[MAXN],q2[MAXN],r1,r2;
struct ZKW
{
int fst[MAXN],to[MAXM<<],nxt[MAXM<<],val[MAXM<<],cos[MAXM<<],cnt;
int dis[MAXN],s,t,vis[MAXN],res;
ZKW() {res=,cnt=;}//memset(fst,0xff,sizeof(fst));}
void add(int u,int v,int w,int c) {nxt[cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w,cos[cnt++]=c;}
int spfa()
{
memset(dis,,sizeof(dis));
queue<int> q;
dis[t]=,vis[t]=;
q.push(t);
while(!q.empty())
{
int x=q.front();q.pop();vis[x]=;
for(int i=fst[x];i;i=nxt[i])
if(val[i^]&&dis[to[i]]>dis[x]-cos[i])
{
//cout<<x<<" "<<dis[x]<<" "<<to[i]<<endl;
dis[to[i]]=dis[x]-cos[i];
if(!vis[to[i]]) {q.push(to[i]);vis[to[i]]=;}
}
}
//memset(vis,0,sizeof(vis));
//cout<<dis[s]<<endl<inf;
return dis[s]<;
}
int dfs(int x,int a)
{
if(x==t||!a) {res+=dis[s]*a;return a;}
if(vis[x])return ;
vis[x]=;
//cout<<x<<endl;
int res=,f;
for(int i=fst[x];i&&a;i=nxt[i])
if(val[i]&&dis[to[i]]==dis[x]-cos[i]&&(f=dfs(to[i],min(a,val[i]))))
res+=f,val[i]-=f,val[i^]+=f,a-=f;
vis[x]=;
return res;
}
void solve()
{
while(spfa())
{
vis[t] = ;
while(vis[t])
{
memset(vis,,sizeof(vis));
dfs(s,);
}
}
}
}Z;
void mem()
{
for(int i=;i<=n;i++)
{
if(!ntp[i]) p[++tot]=i;
for(int j=;p[j]*i<=n&&j<=tot;j++)
{
ntp[p[j]*i]=;
if(i%p[j]==) break;
}
}Z.s=,Z.t=tot+;
}
int calc(int n,int x) {int i=x;for(;i*x<=n;i*=x);return i;}
int main()
{
//freopen("kissatenn16.in","r",stdin);
n=read();mem();int h=sqrt(n),a,b,tmp,k;
for(int i=;i<=tot;i++)
{
//cout<<i<<" "<<p[i]<<" "<<ans<<endl;
if(p[i]*>n) {ans+=p[i];continue;}
if((ll)p[i]*p[i]<=n){Z.add(Z.s,i,,);Z.add(i,Z.s,,);ans+=calc(n,p[i]);q1[++r1]=i;}
else {Z.add(i,Z.t,,);Z.add(Z.t,i,,);ans+=p[i],q2[++r2]=i;}
}
for(int i=;i<=r1;i++)
for(int j=;j<=r2;j++)
{
a=p[q1[i]],b=p[q2[j]];
if(p[q1[i]]*p[q2[j]]<=n)
{
tmp=calc(n/b,a)*b,k=calc(n,a)+b;
//cout<<a<<" "<<b<<" "<<tmp<<" "<<k<<endl;
if(tmp>k) {Z.add(q1[i],q2[j],,k-tmp);Z.add(q2[j],q1[i],,tmp-k);}
}
else break;
}
//cout<<ans<<endl;
Z.solve();printf("%d",ans-Z.res+);
}

bzoj 3308 九月的咖啡店的更多相关文章

  1. bzoj 3308: 九月的咖啡店【最大费用最大流】

    费用流里spfa最后的判断要写成dis[t]>=0而不是dis[t]!=-inf否则会WAWAWA-- #include<iostream> #include<cstdio&g ...

  2. 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)

    3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 244  Solved: 86 Description 深绘里在九份开了一家咖 ...

  3. 【BZOJ-3308】九月的咖啡店 最大费用最大流 + 线性筛素数

    3308: 九月的咖啡店 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 159  Solved: 56[Submit][Status][Discuss ...

  4. [bzoj3308]九月的咖啡店_欧拉筛素数_费用流

    bzoj-3308 九月的咖啡店 题目大意:深绘里在九份开了一家咖啡让,如何调配咖啡民了她每天的头等大事我们假设她有N种原料,第i种原料编号为i,调配一杯咖啡则需要在这里若干种兑在一起.不过有些原料不 ...

  5. BZOJ3308 九月的咖啡店

    Orz PoPoQQQ 话说这题还有要注意的地方... 就是...不能加SLF优化,千万不能加 n = 40000,不加本机跑出来2sec,加了跑出来40sec...[给跪了 /*********** ...

  6. BZOJ 3308 毒瘤结论 网络流

    结论:在答案集合中的数其质因数最多有两个 且有两个的话一个>n1/2一个<n1/2 这样我们就可以把所有质数筛出来 弄成二分图 左边是<n1/2右边是>n1/2的 所以先把单个 ...

  7. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  8. 【bzoj5050】【bzoj九月月赛H】建造摩天楼

    讲个笑话,这个题很休闲的. 大概是这样的,昨天看到这个题,第一眼星际把题目看反了然后感觉这是个傻逼题. 后来发现不对,这个修改一次的影响是很多的,可能导致一个数突然可以被改,也可能导致一个数不能被改. ...

  9. BZOJ 2127: happiness [最小割]

    2127: happiness Time Limit: 51 Sec  Memory Limit: 259 MBSubmit: 1815  Solved: 878[Submit][Status][Di ...

随机推荐

  1. Ubuntu终端常用快捷键汇总

    Ubuntu终端常用的快捷键 - 转自- 博客园  http://www.cnblogs.com/nucdy/p/5251659.html   Ubuntu中的许多操作在终端(Terminal)中十分 ...

  2. MySQL-----操作练习

    一.表关系 请创建如下表,并创建相关约束 二.操作表 1.自行创建测试数据 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: select A.student_id from (select ...

  3. JavaEE JDBC 核心API

    JDBC接口核心的API @author ixenos java.sql.*   和  javax.sql.* |- Driver接口: 表示java驱动程序接口.所有的具体的数据库厂商要来实现此接口 ...

  4. 《C语言程序设计(第四版)》阅读心得(三)

    第八章  指针 1.一个变量的地址称为该变量的指针 一个专门用来存放另一变量的地址(即指针),称它为指针变量.指针变量的值是指针(即地址) 如上图2000是变量的指针,pointer是指针变量, 赋值 ...

  5. POJ 2479 两段连续最大和

    题目大意: 在一组数中,找到连续的两段 , 是这两段相加和达到最大 这里利用dp[2][N]的数组保存所有的状态 dp[0][i]表示取到第i个数时只取了一段的最大和,第i个数是一定要被取到的 dp[ ...

  6. [luoguP1970] 花匠(DP)

    传送门 n2 过不了惨啊 70分做法 f[i][0] 表示第 i 个作为高的,的最优解 f[i][0] 表示第 i 个作为低的,的最优解 (且第 i 个一定选) 那么 f[i+1][1]=max(f[ ...

  7. Labeling Balls(poj 3687)

    题意:N个球,从1-N编号,质量不同,范围1-N,无重复.给出小球间的质量关系(<), 要求给每个球贴标签,标签表示每个球的质量.按编号输出每个球的标签.如果解不唯一,按编号小的质量小排. /* ...

  8. [USACO08NOV]时间管理Time Management

    题目描述 Ever the maturing businessman, Farmer John realizes that he must manage his time effectively. H ...

  9. 【SGU194&ZOJ2314】Reactor Cooling(有上下界的网络流)

    题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流 ...

  10. 学习swift从青铜到王者之字符串和运算符02

    1 字符和字符串初步  var c :Character = "a" 2 构造字符串  let str1 = "hello" let str2 = " ...