「SDOI2016」数字配对
「SDOI2016」数字配对
题目大意
题解
\(a_i\) 是 \(a_j\) 的倍数,且 \(\frac{a_i}{a_j}\) 是一个质数,则将 \(a_i,a_j\) 质因数分解后,其质因子的次数和相差为 \(1\)。
由此我们可以想到根据质因子次数和的奇偶性对 \(a_i\) 进行分组,不难发现会被分成两组。这让我们联想到了二分图。
我们考虑采用费用流求解。
首先我们可以将源点 \(s\) 向其中一组点连容量为 \(b_i\),费用为 \(0\) 的边,然后从另外一组点的每个点向汇点 \(t\) 连容量为 \(b_i\),费用为 \(0\) 的边,限制每个数能够被配对的次数。
然后我们可以在满足条件的点对 \((a_i,a_j)\) 间连一条容量为 \(\min(b_i,b_j)\),费用为 \(c_i\cdot c_j\) 的边。
最后跑最大费用最大流即可。
这里题目要求费用非负,所以在统计答案的时候处理一下使其在非负的条件下流最大即可。
注意有的地方需要开 \(\text{long long}\)。
/*---Author:HenryHuang---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e2+5;
typedef long long ll;
struct edge{
int to,nex;
ll w,v;
}e[maxn*maxn*4];
int head[maxn],cur[maxn],tot=1;
void add(int a,int b,ll c,ll d){
e[++tot]=(edge){b,head[a],c,d};
head[a]=cur[a]=tot;
}
void add_edge(int a,int b,ll c,ll d){
add(a,b,c,d);
add(b,a,0,-d);
}
int solve(int n){
int i=2,ans=0;
while(i*i<=n){
while(n%i==0) ++ans,n/=i;
++i;
}
if(n!=1) ++ans;
return ans;
}
int a[maxn],b[maxn],c[maxn];
int cnt[maxn];
int n,m,s,t;
ll dis[maxn];
bool vis[maxn];
bool spfa(){
for(int i=0;i<=n+1;++i) cur[i]=head[i],dis[i]=-1ll<<60;
memset(vis,0,sizeof vis);
queue<int> Q;
dis[s]=0,vis[s]=1,Q.push(s);
while(!Q.empty()){
int u=Q.front();Q.pop();
vis[u]=0;
for(int i=head[u];i;i=e[i].nex){
int v=e[i].to;
if(e[i].w&&dis[v]<dis[u]+e[i].v){
dis[v]=dis[u]+e[i].v;
if(!vis[v]) vis[v]=1,Q.push(v);
}
}
}
return dis[t]>-1ll<<60;
}
int dfs(int u,ll in){
if(u==t) return in;
ll out=0,tmp;
vis[u]=1;
for(int i=cur[u];i;i=e[i].nex){
int v=e[i].to;cur[u]=i;
if((!vis[v])&&e[i].w&&dis[v]==dis[u]+e[i].v&&(tmp=dfs(v,min(in,e[i].w)))){
e[i].w-=tmp,e[i^1].w+=tmp;
in-=tmp,out+=tmp;
}
}
if(!out) dis[u]=0;
vis[u]=0;
return out;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=n;++i) cin>>b[i];
for(int i=1;i<=n;++i) cin>>c[i];
s=0,t=n+1;
for(int i=1;i<=n;++i){
cnt[i]=solve(a[i]);
}
for(int i=1;i<=n;++i){
if(cnt[i]&1) add_edge(s,i,b[i],0);
else add_edge(i,t,b[i],0);
for(int j=1;j<=n;++j){
if(cnt[i]&1)
if((a[i]%a[j]==0&&cnt[j]+1==cnt[i])||(a[j]%a[i]==0&&cnt[i]+1==cnt[j]))
add_edge(i,j,1<<30,1ll*c[i]*c[j]);
}
}
ll ans=0,now=0,d=0;
int flag=0;
while(spfa()){
memset(vis,0,sizeof vis);
while(d=dfs(s,1ll<<60),d!=0){
memset(vis,0,sizeof vis);
if(now+d*dis[t]<0){
ans+=now/(-dis[t]);
flag=1;break;
}
ans+=d;
now+=d*dis[t];
}
if(flag) break;
}
cout<<ans<<'\n';
return 0;
}
「SDOI2016」数字配对的更多相关文章
- 【LOJ】#2031. 「SDOI2016」数字配对
题解 这个图是个二分图,因为如果有一个奇环的话,我们会发现一个数变成另一个数要乘上个数不同的质数,显然不可能 然后我们发现这个不是求最大流,而是问一定价值的情况下最大流是多少,二分一个流量,加上一条边 ...
- loj2031 「SDOI2016」数字配对
跑最大费用最大流,注意到每次 spfa 出来的 cost 一定是越来越少的,啥时小于 \(0\) 了就停了吧. #include <iostream> #include <cstri ...
- liberOJ #2033. 「SDOI2016」生成魔咒 后缀数组
#2033. 「SDOI2016」生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 11.2 22 拼凑起来形成一个魔咒串 [1,2] [1, 2] ...
- 「SDOI2016」储能表(数位dp)
「SDOI2016」储能表(数位dp) 神仙数位 \(dp\) 系列 可能我做题做得少 \(QAQ\) \(f[i][0/1][0/1][0/1]\) 表示第 \(i\) 位 \(n\) 是否到达上界 ...
- loj#2128. 「HAOI2015」数字串拆分 矩阵乘法
目录 题目链接 题解 代码 题目链接 loj#2128. 「HAOI2015」数字串拆分 题解 \(f(s)\)对于\(f(i) = \sum_{j = i - m}^{i - 1}f(j)\) 这个 ...
- [SDOI2016 Round1] 数字配对
COGS 2221. [SDOI2016 Round1] 数字配对 http://www.cogs.pro/cogs/problem/problem.php?pid=2221 ★★★ 输入文件:m ...
- [LOJ 2070] 「SDOI2016」平凡的骰子
[LOJ 2070] 「SDOI2016」平凡的骰子 [题目链接] 链接 [题解] 原题求的是球面面积 可以理解为首先求多面体重心,然后算球面多边形的面积 求重心需要将多面体进行四面体剖分,从而计算出 ...
- Cogs 2221. [SDOI2016 Round1] 数字配对(二分图)
[SDOI2016 Round1] 数字配对 ★★★ 输入文件:menci_pair.in 输出文件:menci_pair.out 简单对比 时间限制:1 s 内存限制:128 MB [题目描述] 有 ...
- 「SDOI2016」征途 题解
「SDOI2016」征途 先浅浅复制一个方差 显然dp,可以搞一个 \(dp[i][j]\)为前i段路程j天到达的最小方差 开始暴力转移 \(dp[i][j]=min(dp[k][j-1]+?)(j- ...
随机推荐
- Django(43)restful接口规范
restful接口规范 什么是接口规范?接口规范就是为了采用不同的后台语言,也能使用同样的接口获取到同样的数据.如何写接口:接口规范是规范化书写接口的,写接口要写url.响应数据 注:如果将 ...
- Jmeter- 笔记9 - CLI(无图形界面)
使用CLI模式,减少资源占用 用GUI调试好脚本 在jmeter的bin文件夹运行cmd,然后输入命令:jmeter -n -t [jmx file] -l [results file] -e -o ...
- MySQL压缩包下载解压安装步骤
MySQL官网下载地址:https://downloads.mysql.com/archives/community/ 1.选择自己需要的版本,本教程是mysql-5.7.29-winx64版本 2. ...
- SpringBoot基础系列之自定义配置源使用姿势实例演示
[SpringBoot基础系列]自定义配置源的使用姿势介绍 前面一篇博文介绍了一个@Value的一些知识点,其中提了一个点,@Value对应的配置,除了是配置文件中之外,可以从其他的数据源中获取么,如 ...
- 手把手教你彻底理解MySQL的explain关键字
数据库是程序员必备的一项基本技能,基本每次面试必问.对于刚出校门的程序员,你只要学会如何使用就行了,但越往后工作越发现,仅仅会写sql语句是万万不行的.写出的sql,如果性能不好,达不到要求,可能会阻 ...
- 【疑难杂症】高版本UG从老UI中获取汉字字符串后乱码的问题
结论:NXstring转换为char类型的时候导致了乱码 措施: 改前:string strA=Test001::test001StrName->ItemValue().GetText(); / ...
- Spring Boot WebFlux-04——WebFlux 整合 Thymeleaf
第04课:WebFlux 整合 Thymeleaf 上一篇介绍的是用 MongoDB 来实现 WebFlux 对数据源的操作,那么有了数据需要渲染到前台给用户展示,这就是本文关心的 View 层,Vi ...
- 浅谈lambda表达式<最通俗易懂的讲解
Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论.Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中.想想看,在Java8 ...
- noip2010 总结
机器翻译 题目背景 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 题目描述 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词 ...
- Winform中用户自定义控件中外部设置子控件属性的方法
假设我们新建立一个用户自定义控件,由一个lable1和pictureBox1组成 此时我们在外部调用该控件,然后想动态改变lable1的值,我们该怎么办? 假设实例化的用户控件名为UserContro ...