正解:网络流

解题报告:

我永远喜欢$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. @atcoder - AGC036E@ ABC String

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个仅由 A, B, C 组成的字符串 S. 求 S 的一个 ...

  2. 前端知识---html

    HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏 ...

  3. @codeforces - 1205C@ Palindromic Paths

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

  4. 仿IOS效果-带弹簧动画的ListView

    背景介绍 最近项目打算做一个界面,类似于dayone首页的界面效果,dayone 是一款付费应用,目前只有IOS端.作为一个资深懒惰的程序员,奉行的宗旨是绝对不重复造一个轮子.于是乎,去网上找一大堆开 ...

  5. selenium webdriver学习(四)------------定位页面元素(转)

    selenium webdriver学习(四)------------定位页面元素 博客分类: Selenium-webdriver seleniumwebdriver定位页面元素findElemen ...

  6. win10 uwp httpClient 登陆CSDN

    本文告诉大家如何模拟登陆csdn,这个方法可以用于模拟登陆其他网站. HttpClient 使用 Cookie 我们可以使用下面代码让 HttpClient 使用 Cookie ,有了这个才可以保存登 ...

  7. iphone开发中调用系统打电话功能

    iphone开发中调用打电话功能,一般有2种: 1.系统的打电话代码,不返回当前程序: Java代码 [[UIApplication sharedApplication] openURL:[NSURL ...

  8. 2012-4-2 通过MdiParent设置窗体最前

    SentenceForm form = new SentenceForm(); form.MdiParent = this; form.Show(); //form.MdiParent = this; ...

  9. phpstorm 中git 的使用

    phpstorm 是一款不可多得的IDE 环境,它既是一款强大的编辑器,还是一款调试器,同时还是一款git 可视化管理工具哟,phpers 值得拥有.今天介绍的是他不为人知的强大功能 —— git. ...

  10. CentOS7增加或修改SSH端口号

    https://blog.csdn.net/ausboyue/article/details/53691953 前言:开启某服务或软件的端口,要从该服务或软件监听的端口(多以修改配置文件为主),SeL ...