bzoj 4514: 数字配对
题目大意
题解
我们打表观察规律发现一定能构成一张二分图
也就是不存在奇环
所以我们一般保证费用非负的最大流即可.
#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: 数字配对的更多相关文章
- 图论(费用流):BZOJ 4514 [Sdoi2016]数字配对
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 820 Solved: 345[Submit][Status ...
- BZOJ 4514: [Sdoi2016]数字配对 [费用流 数论]
4514: [Sdoi2016]数字配对 题意: 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数 ...
- BZOJ 4514: [Sdoi2016]数字配对
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1606 Solved: 608[Submit][Statu ...
- 【BZOJ-4514】数字配对 最大费用最大流 + 质因数分解 + 二分图 + 贪心 + 线性筛
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 726 Solved: 309[Submit][Status ...
- SDOI 2016 数字配对
题目大意:给定n个数字以及每个数字的个数和权值,将满足条件的数字配对,使得总代价不小于0,且配对最多 最大费用最大流拆点,对于每个点,连一条由S到该点的边,容量为b,花费为0,再连一条到T的边 对于每 ...
- [SDOI2016 Round1] 数字配对
COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★ 输入文件:m ...
- 【BZOJ4514】【SDOI2016】数字配对 [费用流]
数字配对 Time Limit: 10 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description 有 n 种数字,第 i 种数字是 ...
- 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流
[bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...
- 【BZOJ4514】[Sdoi2016]数字配对 费用流
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
随机推荐
- Hibernate学习四----------Blob
© 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...
- less1.5中的减错误
(@bodywidth)-@leftwidth即在第一个变量外加括号---正确 @bodywidth-@leftwidth即直接使用不加括号--------错误
- rst2pdf 中文
上篇说到用pandoc转换为reST为pdf是使用LaTeX作为中间格式的,而今天要说的rst2pdf貌似是直接转换为pdf的. 安装和调用 rst2pdf目前只支持Python2.7,因此在创建vi ...
- MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...
- NDK以及C语言基础语法(一)
一.什么是NDK? Native Development Kit (本地开发工具包): NDK中提供了一系列的工具,帮助我们快速开发C/C++的动态库,并能自动将so文件和java文件一起打包成apk ...
- 各种jar包下方法的使用
commons-codec-1.6.jar: DigestUtils.md5Hex(String str); httpclient-4.2.2.jar: HttpClient client=new D ...
- 九度OJ 1077:最大序列和 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5600 解决:1637 题目描述: 给出一个整数序列S,其中有N个数,定义其中一个非空连续子序列T中所有数的和为T的"序列和&qu ...
- Python爬虫--Urllib库
Urllib库 Urllib是python内置的HTTP请求库,包括以下模块:urllib.request (请求模块).urllib.error( 异常处理模块).urllib.parse (url ...
- 设计模式 - 单件模式(singleton pattern) 具体解释
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u012515223/article/details/28595349 单件模式(singleton ...
- subline 的常用命令
zsh 配置 编辑zsh 命令 vim .zshrc alias subl="/Applications/Sublime\ Text.app/Contents/SharedSupport/b ...