牛客练习赛 小D的剑阵 解题报告
小D的剑阵
题意链接:
https://ac.nowcoder.com/acm/contest/369/F
来源:牛客网
现在你有 \(n\) 把灵剑,其中选择第i把灵剑会得到的 \(w_i\) 攻击力。
于此同时,还有 \(q\) 个约束,每个约束形如:x y v_0 v_1 v_2
\(x\) 和 \(y\) 表示两个物品的编号,如果同时选中可以获得额外 \(v_0\) 的攻击力, 同时不选可以获得额外 \(v_1\) 点攻击力,只选择一个则会扣除 \(v_2\) 的攻击力。
小D想知道剑阵的最大攻击力。
范围
\(1≤n≤10^3,0≤q≤2×10^3,2≤w_i,v_0,v_1,v_2≤7×10^4\),且 \(w_i,v_0,v_1,v_2\) 均为偶数。
数据保证对于任一无序对\((x,y)\)只会有一个约束。
第一次见到类似建模,记录一下
显然是网络流。
我们先把\(w,v_0,v_1\)求和,这样就转换成了减去最小代价
考虑这样表示一个约束

考虑一个割,点被割到\(S\)表示不选,割到\(T\)表示选
然后这个基本情况有四种
- 割\(a,b\),全选 \(a+b=v_1\)
- 割\(f,e\),全不选 \(e+f=v_0+w_A+w_B\)
- 割\(a,c,e\),选\(A\),不选\(B\) \(a+c+e=v_0+v_1+v_2+w_B\)
- 割\(b,d,f\),选\(B\),不选\(A\) \(b+d+f=v_0+v_1+v_2+w_A\)
然后构造一种合法解进行连边
注意一下,构造中含有\(w\)的应该只连一次,所以要把含边权\(w\)的重边一起合并。
Code:
#include <cstdio>
#include <cstring>
#include <algorithm>
using std::min;
const int N=1e3+10;
const int M=3e4+10;
const int inf=0x3f3f3f3f;
int head[N],to[M],Next[M],edge[M],cnt=1;
void add(int u,int v,int w)
{
to[++cnt]=v,edge[cnt]=w,Next[cnt]=head[u],head[u]=cnt;
to[++cnt]=u,edge[cnt]=0,Next[cnt]=head[v],head[v]=cnt;
}
int n,m,s,t,w[N],yuu[N];
int q[N],dep[N],l,r;
bool bfs()
{
memset(dep,0,sizeof dep);
dep[q[l=r=1]=s]=1;
while(l<=r)
{
int now=q[l++];
for(int v,i=head[now];i;i=Next[i])
if(edge[i]&&!dep[v=to[i]])
{
dep[v]=dep[now]+1;
if((q[++r]=v)==t) return true;
}
}
return false;
}
int dfs(int now,int flow)
{
if(now==t) return flow;
int res=flow,bee;
for(int v,i=head[now];i&&res;i=Next[i])
if(edge[i]&&dep[v=to[i]]==dep[now]+1)
{
bee=dfs(v,min(res,edge[i]));
if(!bee) {dep[v]=0;continue;}
res-=bee,edge[i]-=bee,edge[i^1]+=bee;
}
return flow-res;
}
int main()
{
scanf("%d%d",&n,&m);int ans=0;
for(int i=1;i<=n;i++) scanf("%d",w+i),ans+=w[i];
s=n+1,t=s+1;
for(int x,y,v0,v1,v2,a,i=1;i<=m;i++)
{
scanf("%d%d%d%d%d",&x,&y,&v0,&v1,&v2);
ans+=v0+v1;
yuu[x]+=v1>>1,yuu[y]+=v1>>1;
w[x]+=v0>>1,w[y]+=v0>>1;
a=v0+v1+(v2<<1)>>1;
add(x,y,a),add(y,x,a);
}
for(int i=1;i<=n;i++) add(s,i,yuu[i]),add(i,t,w[i]);
int maxflow=0,flow;
while(bfs()) while(flow=dfs(s,inf)) maxflow+=flow;
printf("%d\n",ans-maxflow);
return 0;
}
2019.2.16
牛客练习赛 小D的剑阵 解题报告的更多相关文章
- 牛客练习赛 小A与任务 解题报告
小A与任务 链接: https://ac.nowcoder.com/acm/contest/369/B 来源:牛客网 题目描述 小A手头有 \(n\) 份任务,他可以以任意顺序完成这些任务,只有完成当 ...
- 牛客练习赛 小A与最大子段和 解题报告
小A与最大子段和 题意 在一个序列 \(\{a\}\) 里找到一个非空子段 \(\{b\}\), 满足 \(\sum\limits_{i=1}^{|b|}b_i\times i\) 最大 \(n\le ...
- 牛客练习赛 小D的Lemon 解题报告
小D的Lemon 题意 已知 \[ g(x)=\left\{\begin{matrix} 1&,x=1\\ \sum_{i=1}^qk_i&,otherwise \end{matrix ...
- 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)
牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...
- 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
- 牛客练习赛44 A 小y的序列 (模拟,细节)
链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...
- 牛客练习赛26:D-xor序列(线性基)
链接:牛客练习赛26:D-xor序列(线性基) 题意:小a有n个数,他提出了一个很有意思的问题:他想知道对于任意的x, y,能否将x与这n个数中的任意多个数异或任意多次后变为y 题解:线性基 #inc ...
- [堆+贪心]牛客练习赛40-B
传送门:牛客练习赛40 题面: 小A手头有 n 份任务,他可以以任意顺序完成这些任务,只有完成当前的任务后,他才能做下一个任务 第 i 个任务需要花费 x_i 的时间,同时完成第 i 个任务的时间不 ...
- 牛客练习赛42 C 出题的诀窍 (贡献,卡常)
牛客练习赛42 C 出题的诀窍 链接:https://ac.nowcoder.com/acm/contest/393/C来源:牛客网 题目描述 给定m个长为n的序列a1,a2,-,ama_1 , a_ ...
随机推荐
- RHEL7基本命令
Terminal TTY TTY是TeleTYpe的一个老缩写. Teletypes,或者teletypewriters,原来指的是电传打字机,是通过串行线用打印机键盘通过阅读和发送信息的东西,和古老 ...
- CentOS安装noVNC,以Web方式交付VNC远程连接
什么是noVNC noVNC 是一个 HTML5 VNC 客户端,采用 HTML 5 WebSockets, Canvas 和 JavaScript 实现,noVNC 被普遍用在各大云计算.虚拟机控制 ...
- Linux df du 命令
df 命令 检查磁盘空间占用情况(并不能查看某个目录占用的磁盘大小). 命令格式:df [option] -h 以容易理解的格式(给人看的格式)输出文件系统分区使用情况,例如 10kB.10MB.10 ...
- CentOS 6下gcc升级的操作记录(由默认的4.4.7升级到6.4.0版本)
机房一台centos6.9机器部署了jenkins发布系统,开发人员在用node编译js,发现依赖的gcc版本低了,故需要将gcc升级到高版本(至少5.0版本以上),这里选择升级到6.4.0版本,下面 ...
- cookie详解(含vue-cookie)
今天看到一篇cookie的文章,写的特别详细,感谢 晚晴幽草轩 的分享,原文链接http://mp.weixin.qq.com/s/NXrH7R8y2Dqxs9Ekm0u33w 原文如下,记录到此供以 ...
- SQL Server扩充表字段长度,引发的意外KILLED/ROLLBACK
这一段时间,因为系统升级,新系统产生的数据长度,比原来的数据长度要长,所以说要扩充一下字段长度. ) --修改字段长度sql 在执行的时候,有这样一个情况. 例如Student表的Name字段长度是n ...
- 牛客小白月赛6-E对弈-简单搜索
https://www.nowcoder.com/acm/contest/136/E 我搜索很差啊,看了学长代码,自己在下面手敲了一遍,感觉学长的极其精巧,把我繁琐的搜索步骤给简化了不少 其实本题想法 ...
- 北航学堂Android客户端Beta阶段发布说明
在从学姐那里拿到服务接口的代码最终连通服务器之后,经过我们团队的努力,终于把前后端融合生成了我们目前的版本, 因为我们在Alpha阶段网络连接部分是一直没有搞定的,所以这个版本其实并不算是真正的Bet ...
- 《Linux内核设计与实现》第十八章学习笔记
第十八章 调试 [学习时间:1小时 总结博客时间:1小时15分] [学习内容:出现bug的原因.内核调试器gdb.使用Git进行二分查找] 内核级开发的调试工作远比用户级开发艰难,它带来的风险比用户级 ...
- win10下安装GLPK
认识GLPK GLPK是一个解决线性规划问题的工具.是GNU计划下一个用于解线性规 划(Linear Programming)的工具包.它可以方便的描述线性规划问题,并给出相应解. 因此在linux系 ...