题目大意

自己看

题解

我们打表观察规律发现一定能构成一张二分图

也就是不存在奇环

所以我们一般保证费用非负的最大流即可.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
template<typename T>inline void read(T &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 256;
const int inf = 0x3f3f3f3f;
inline bool judge(int n){
if(n == 1) return false;
if(n == 2) return true;
for(int i = 2;i*i<=n;++i){
if(n % i == 0) return false;
}return true;
}
int a[maxn],b[maxn];ll c[maxn];
namespace gra{
struct Edge{
int to,next;
}G[21010];
int head[maxn],cnt;
void add(int u,int v){
//printf("%d\n",cnt);
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
}
inline void insert(int u,int v){
add(u,v);add(v,u);
}
int col[maxn];
#define v G[i].to
void dfs(int u,int c){
col[u] = c;
for(int i = head[u];i;i=G[i].next){
if(col[v] == -1) dfs(v,c^1);
}
}
#undef v
}
namespace net{
struct Edge{
int to,next,cap;
ll cost;
}G[21010];
int head[maxn],cnt=1;
void add(int u,int v,int c,ll co){
//printf("%d\n",cnt);
G[++cnt].to = v;
G[cnt].next = head[u];
head[u] = cnt;
G[cnt].cap = c;
G[cnt].cost = co;
}
inline void insert(int u,int v,int c,ll co){
//printf("%d -> %d (%d,%lld)\n",u,v,c,co);
add(u,v,c,co);add(v,u,0,-co);
}
const int lim = maxn<<2;
int S = maxn-5,T = S+1,l,r,q[lim+10];
int flow[maxn],p[maxn];
ll dis[maxn],nw_dis;
int ans;
bool inq[maxn];
inline int find(int r,ll w){
int l = 0,ret = 0;
while(l <= r){
int mid = l+r >> 1;
if(mid*w+nw_dis >= 0) ret = mid,l = mid+1;
else r = mid-1;
}return ret;
}
#define v G[i].to
bool spfa(){
memset(dis,-0x3f,sizeof dis);
l = 0;r = -1;q[++r] = S;
dis[S] = 0;flow[S] = inf;
inq[S] = true;
while(l <= r){
int u = q[l % lim];++l;
for(int i = head[u];i;i=G[i].next){
if(dis[v] < dis[u] + G[i].cost && G[i].cap){
dis[v] = dis[u] + G[i].cost;
flow[v] = min(flow[u],G[i].cap);
p[v] = i;
if(!inq[v]){
q[++r % lim] = v;
inq[v] = true;
}
}
}inq[u] = false;
}if(dis[T] == dis[0]) return false;
if(dis[T] < 0) flow[T] = find(flow[T],dis[T]);
if(flow[T] == 0) return false;
ans += flow[T];
nw_dis += flow[T]*dis[T];
for(int u = T;u != S;u = G[p[u]^1].to)
G[p[u]].cap -= flow[T],G[p[u]^1].cap += flow[T];
return true;
}
#undef v
}
int main(){
int n;read(n);memset(gra::col,-1,sizeof gra::col);
for(int i=1;i<=n;++i) read(a[i]);
for(int i=1;i<=n;++i) read(b[i]);
for(int i=1;i<=n;++i) read(c[i]);
for(int i=1;i<=n;++i){
for(int j=1;j<=n;++j){
if(i == j) continue;
if(a[i] % a[j] == 0 && judge(a[i]/a[j])){
gra::insert(i,j);
}
}
}
for(int i=1;i<=n;++i) if(gra::col[i] == -1) gra::dfs(i,0);
for(int u=1;u<=n;++u){
if(gra::col[u] == 0){
net::insert(net::S,u,b[u],0);
for(int i = gra::head[u];i;i=gra::G[i].next){
net::insert(u,gra::G[i].to,inf,c[u]*c[gra::G[i].to]);
}
}else{
net::insert(u,net::T,b[u],0);
}
}while(net::spfa());
printf("%d\n",net::ans);
getchar();getchar();
return 0;
}

bzoj 4514: 数字配对的更多相关文章

  1. 图论(费用流):BZOJ 4514 [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 820  Solved: 345[Submit][Status ...

  2. BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]

    4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...

  3. BZOJ 4514: [Sdoi2016]数字配对

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1606  Solved: 608[Submit][Statu ...

  4. 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛

    4514: [Sdoi2016]数字配对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 726  Solved: 309[Submit][Status ...

  5. SDOI 2016 数字配对

    题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...

  6. [SDOI2016 Round1] 数字配对

    COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★   输入文件:m ...

  7. 【BZOJ4514】【SDOI2016】数字配对 [费用流]

    数字配对 Time Limit: 10 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...

  8. 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流

    [bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...

  9. 【BZOJ4514】[Sdoi2016]数字配对 费用流

    [BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...

随机推荐

  1. Hibernate学习四----------Blob

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  2. less1.5中的减错误

    (@bodywidth)-@leftwidth即在第一个变量外加括号---正确 @bodywidth-@leftwidth即直接使用不加括号--------错误

  3. rst2pdf 中文

    上篇说到用pandoc转换为reST为pdf是使用LaTeX作为中间格式的,而今天要说的rst2pdf貌似是直接转换为pdf的. 安装和调用 rst2pdf目前只支持Python2.7,因此在创建vi ...

  4. MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)

    表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...

  5. NDK以及C语言基础语法(一)

    一.什么是NDK? Native Development Kit (本地开发工具包): NDK中提供了一系列的工具,帮助我们快速开发C/C++的动态库,并能自动将so文件和java文件一起打包成apk ...

  6. 各种jar包下方法的使用

    commons-codec-1.6.jar: DigestUtils.md5Hex(String str); httpclient-4.2.2.jar: HttpClient client=new D ...

  7. 九度OJ 1077:最大序列和 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5600 解决:1637 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的"序列和&qu ...

  8. Python爬虫--Urllib库

    Urllib库 Urllib是python内置的HTTP请求库,包括以下模块:urllib.request (请求模块).urllib.error( 异常处理模块).urllib.parse (url ...

  9. 设计模式 - 单件模式(singleton pattern) 具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...

  10. subline 的常用命令

    zsh 配置 编辑zsh 命令 vim .zshrc alias subl="/Applications/Sublime\ Text.app/Contents/SharedSupport/b ...