[SDOI2016] 数字配对 题解
发现题目中描述的配对条件可以理解为:\(pc_i-pc_j=1\) 且 \(a_i\bmod a_j=0\),其中 \(pc_i\) 表示 \(a_i\) 的质因数个数。
自然想到以 \(pc\) 奇偶性建立二分图,可以配对的点间连一条边。
先不考虑费用,三种边为:
- \((s,i,b_i)\),其中 \(pc_i\bmod 2=1\)。
 - \((i,t,b_i)\),其中 \(pc_i\bmod 2=0\)。
 - \((i,j,INF)\),其中 \(pc_i\bmod 2=1,pc_j\bmod 2=0,|pc_i-pc_j|=1,\max(a_i,a_j)\bmod\min(a_i,a_j)=0\)。
前两种边的费用为 \(0\),最后一种为所得价值 \(c_i\times c_j\)。 
由于我们希望总价值为正,所以 \(spfa\) 他死了 用来跑最长路。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=205,M=1e5+5;
int n,s,t,k=1,h[N],p[M],vis[N];
int cnt,l,m,to[M],nxt[M],lst[N];
int pc[N],vv[M],a[N],d[N],o[N];
ll w[M],f[M],flw[N],dis[N],c[N];
void add(int x,int y,ll z,ll q){
    w[++k]=z;f[k]=q;to[k]=y;
    nxt[k]=h[x];h[x]=k;
    f[++k]=-q;to[k]=x;
    nxt[k]=h[y];h[y]=k;
}queue<int>q;
int spfa(){
    while(q.size()) q.pop();
    for(int i=s;i<=t;i++)
        lst[i]=-1,vis[i]=0,dis[i]=-1e18;
    flw[s]=1e18;dis[s]=0;q.push(s);
    while(q.size()){
        int x=q.front();
        q.pop();vis[x]=0;
        for(int i=h[x];i;i=nxt[i]){
            int y=to[i];ll vl=w[i];
            if(vl&&dis[y]<dis[x]+f[i]){
                lst[y]=i;
                flw[y]=min(flw[x],vl);
                dis[y]=dis[x]+f[i];
                if(!vis[y])
                    q.push(y),vis[y]=1;
            }
        }
    }return lst[t]!=-1;
}ll mxflw,mncst;
void MCMF(){
    while(spfa()){
        if(mncst+dis[t]*flw[t]<0){
            mxflw+=mncst/(-dis[t]);return;
        }mxflw+=flw[t];mncst+=dis[t]*flw[t];
        for(int i=t;i!=s;i=to[lst[i]^1])
            w[lst[i]]-=flw[t],w[lst[i]^1]+=flw[t];
    }
}signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
	for(int i=2;i<M;i++){
		if(vv[i]==0) p[++cnt]=i;
		for(int j=1;j<=cnt&&i*p[j]<M;j++){
			vv[i*p[j]]=1;
			if(i%p[j]==0) break;
		}
	}cin>>n;t=n+1;
    for(int i=1;i<=n;i++){
        cin>>a[i];int x=a[i];
        for(int j=1;x>1&&p[j]*p[j]<=a[i];j++)
            while(x%p[j]==0) x/=p[j],pc[i]++;
        if(x>1) pc[i]++;
        if(pc[i]%2) d[++l]=i;
        else o[++m]=i;
    }for(int i=1;i<=n;i++){
        int b;cin>>b;
        if(pc[i]%2) add(s,i,b,0);
        else add(i,t,b,0);
    }for(int i=1;i<=n;i++) cin>>c[i];
    for(int i=1;i<=l;i++)
        for(int j=1;j<=m;j++){
            int x=d[i],y=o[j];
            if(pc[x]+1==pc[y]&&a[y]%a[x]==0)
                add(x,y,1e18,c[x]*c[y]);
            if(pc[y]+1==pc[x]&&a[x]%a[y]==0)
                add(x,y,1e18,c[x]*c[y]);
        }
    MCMF();cout<<mxflw;
    return 0;
}//spfa:它没有死透
												
											[SDOI2016] 数字配对 题解的更多相关文章
- BZOJ4514:[SDOI2016]数字配对——题解
		
https://www.lydsy.com/JudgeOnline/problem.php?id=4514 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj ...
 - 【BZOJ4514】[Sdoi2016]数字配对 费用流
		
[BZOJ4514][Sdoi2016]数字配对 Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ...
 - 图论(费用流):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 是一个质数 ...
 - 【bzoj4514】: [Sdoi2016]数字配对 图论-费用流
		
[bzoj4514]: [Sdoi2016]数字配对 好像正常的做法是建二分图? 我的是拆点然后 S->i cap=b[i] cost=0 i'->T cap=b[i] cost=0 然后 ...
 - BZOJ 4514: [Sdoi2016]数字配对
		
4514: [Sdoi2016]数字配对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1606 Solved: 608[Submit][Statu ...
 - [bzoj4514][SDOI2016]数字配对——二分图
		
题目描述 传送门 题解: 这个题真的是巨坑,经过了6个WA,2个TLE,1个RE后才终于搞出来,中间都有点放弃希望了... 主要是一定要注意longlong! 下面开始说明题解. 朴素的想法是: 如果 ...
 - BZOJ4514 [Sdoi2016]数字配对  【费用流】
		
题目 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×c ...
 - BZOJ4514——[Sdoi2016]数字配对
		
有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对,并获得 ci×cj 的 ...
 - bzoj4514 [Sdoi2016]数字配对
		
Description 有 n 种数字,第 i 种数字是 ai.有 bi 个,权值是 ci. 若两个数字 ai.aj 满足,ai 是 aj 的倍数,且 ai/aj 是一个质数, 那么这两个数字可以配对 ...
 
随机推荐
- Mac文件拷贝Win后的._文件清理
			
前言 我们在从mac向win拷贝文件后总会多出来 部分 ._ 开头的文件或名为.DS_Store的文件 根据上图在苹果官方社区的回答来看,这些文件存储了主文件的一些资料,图表等数据,如果说未来这些文件 ...
 - redmine部署,踩坑而过
			
背景:部门想用个工具来做项目执行进度的管理,为了保证数据私有并且不想花钱,选了redmine. 环境:阿里云服务器,windows server R2企业版 软件版本构成: 官方版本说明http:// ...
 - Less使用备忘录
			
定义 Less (Leaner Style Sheets 的缩写) 是一门向后兼容的 CSS 扩展语言,动态样式语言. 使用方式 直接引入less.js文件 好处:能获取客户端的数据,从而进行进一步的 ...
 - Fleck:一个轻量级的C#开源WebSocket服务端库
			
推荐一个简单易用.轻量级的C#开源WebSocket服务端库,方便我们快速实现WebSocket的开发. 01 项目简介 Fleck 是一个用 C# 编写的轻量级 WebSocket 服务器库.它提供 ...
 - 小程序 构建npm
			
1. 在项目文件夹下 打开cmd 窗口,输入: npm init 一直回车即可 2. 安装模板 npm i @vant/weapp -S --production 3. 在微信开发者工具,左上角工具中 ...
 - SafeHandle 和 Dispose
			
SafeHandle 和 Dispose 这是从 https://www.cnblogs.com/zeroone/p/3708112.html 复制过来的,原文的格式不够好,重新排版一下. SafeH ...
 - 【萌狼蓝天】swagger速成
			
相关链接 编辑器:https://editor.swagger.io/ 文档:https://openapi.apifox.cn/ 基础信息设置 openapi: 3.0.3 info: title: ...
 - 【MySQL】MySQL命令总结 | 数据库与数据表的创建删除与查询
			
@ 目录 数据库 创建数据库 使用数据库 删除数据库 查看所有数据库 数据表 查看数据库中所有数据表 在数据库中创建数据表 删除数据表 修改表名 查询表列(字段)信息 表-删除某一字段 表-增加某一字 ...
 - Docker Compose - 向远程主机部署服务
			
问题描述 通常,我们本地编写 docker-compose.yml 文件,然后运行测试.但是,我们需要在 arm64 环境中进行测试,无法在本地直接运行测试. 我们希望可以在本地编写,然后本地使用 d ...
 - Spring boot 配置文件位置
			
Spring boot 的Application.properties 配置文件可以是以下几个地方:classpath:/,classpath:/config/,file:./,file:./conf ...