正解:网络流

解题报告:

我永远喜欢$loj$!

显然先预处理哪些$a$之间可以连边,然后考虑建两排点,连流量为$c_{i}\cdot c_{j}$,然后$ST$连$inf$,跑个费用流?

然后现在碰到了两个问题$QwQ$

第一个说不能重复使用?

可以考虑这样儿,就如果$(i,j)$是一对可行点对,那就要连$(i,{j}'),(j,{i}')$,显然不可能只跑一条嘛,然后最后答案除以2就成$QwQ$

第二个说问在费用大于等于0的前提下的最大流,,,就很单纯不做作和之前的题都不太一样,,,

考虑贪心,首先说费用最大先取反呗.

然后就每次增广的时候判断下,如果之前增广的费用+当前增广费用>0就取之前算出来的最大流量就成$QwQ$

正确性在于每次跑的都最短路?所以就十分显然不说了$QwQ$

$over$

昂对了记得开$ll$,,,$100pts->50pts$还是有点难受的,,,$QAQ$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define int long long
#define t(i) edge[i].to
#define n(i) edge[i].nxt
#define w(i) edge[i].wei
#define fy(i) edge[i].fy
#define ri register int
#define rb register bool
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+,M=+,inf=1e9;
int head[N],ed_cnt=-,S,T,dis[N],fr_nod[N],fr_ed[N],cost,n,a[N],c[N],fl;
bool vis[N];
struct ed{int to,nxt,wei,fy;}edge[M<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z,ri p)
{
//printf("%d -> %d : %d , %d\n",y,x,z,p);
edge[++ed_cnt]=(ed){x,head[y],z,p};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],,-p};head[x]=ed_cnt;}
il bool spfa()
{
queue<int>Q;Q.push(S);memset(dis,,sizeof(dis));dis[S]=;vis[S]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();vis[nw]=;//printf("nw=%d\n",nw);
e(i,nw)
{
if(w(i) && fy(i)+dis[nw]<dis[t(i)])
{dis[t(i)]=dis[nw]+fy(i);fr_nod[t(i)]=nw;fr_ed[t(i)]=i;if(!vis[t(i)])Q.push(t(i)),vis[t(i)]=;}
}
}
if(dis[T]==dis[T+])return ;
ri flow=dis[T+];
for(ri i=T;i!=S;i=fr_nod[i])flow=min(flow,w(fr_ed[i]));
for(ri i=T;i!=S;i=fr_nod[i])w(fr_ed[i])-=flow,w(fr_ed[i]^)+=flow;
cost+=flow*dis[T];if(cost>){cost-=flow*dis[T];fl+=1ll*cost/(-dis[T]);return ;}fl+=flow;return ;
}
il bool check(ri x){for(ri i=;i*i<=x;++i)if(!(x%i))return ;return ;}
il void pre()
{
rp(i,,n)
{
rp(j,,n)
{
if(i==j)continue;if(a[i]%a[j])continue;if(a[i]==a[j] && i<j)continue;
if(check(a[i]/a[j]))ad(j+n,i,inf,-c[i]*c[j]),ad(i+n,j,inf,-c[i]*c[j]);
}
}
} main()
{
//freopen("4068.in","r",stdin);freopen("4068.out","w",stdout);
n=read();S=;T=n<<|;memset(head,-,sizeof(head));
rp(i,,n)a[i]=read();rp(i,,n){ri x=read();ad(i,S,x,);ad(T,i+n,x,);}rp(i,,n)c[i]=read();pre();
while(spfa());printf("%d\n",fl/);
return ;
}

随机推荐

  1. Git 进阶:10大技巧让你迅速提升

    1.Git自动补全 假使你使用命令行工具运行Git命令,那么每次手动输入各种命令是一件很令人厌烦的事情. 命令: cd ~ curl https://raw.github.com/git/git/ma ...

  2. Laravel 的HTTP控制器

    简介# 除了在路有文件中以闭包的形式定义所有的请求处理逻辑外,还可以使用控制器类来组织此类行为,控制器能够将相关 的请求处理逻辑组成的一个单独的类,控制器被存放在app/Http/Controller ...

  3. ExecutorService小试牛刀

    现在的项目中有将学生批量加入课程的需求,于是想根据这个需求测试一下ExecutorService的效率.假设一个场景:现在有100门课,1500名学生,要求每15个人加入一门课程,不重复. 查询并拼接 ...

  4. @codeforces - 1205C@ Palindromic Paths

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 这是一道交互题. 现在有一个 n*n 的矩阵,每个位置是 0 或 ...

  5. C++ 结构体的定义

    struct 结构体名称{    数据类型 A:    数据类型 B; }结构体变量名; 相当于: struct 结构体名称{    数据类型 A:    数据类型 B; }; struct 结构体名 ...

  6. CODE FESTIVAL 2017 qual B C 3 Steps(补题)

    总感觉这题是个题意杀,理解错题目了,看了好久才发现题目意思:操作是让,只要两点没有直接相连,而且只要有一条路的距离3,就可以把这两点连接起来. 按照题解中讲的,可以把图分为二分图和非二分图来解.不过题 ...

  7. 【C++竞赛 B】yyy的回文数组

    时间限制:1s 内存限制:32MB 问题描述 回文串是一个正读和反读都一样的字符串,比如level或者noon就是回文串.回文数组也是如此,比如[100,200,100]或者[178,256,256, ...

  8. H3C 多区域OSPF配置示例

  9. 【js】vue 2.5.1 源码学习 (十一) 模板编译compileToFunctions渲染函数

    大体思路(九) 本节内容: 1. compileToFunctions定位 1. compileToFunctions定位 ==> createCompiler = createCompiler ...

  10. H3C 路由度量值(Metric)