[模拟赛FJOI Easy Round #2][T3 skill] (最小割+最大权闭合子图(文理分科模型))
【题目描述】
天上红绯在游戏中扮演敏剑,对于高攻击低防御的职业来说,爆发力显得非常重要,为此,她准备学习n个技能,每个技能都有2个学习方向:物理攻击和魔法攻击。对于第i个技能,如果选择物理攻击方向,会增加ap_i的爆发力,如果选择魔法攻击的方向,会增加ad_i的爆发力。此外,还有一些combo,一个combo由两个技能组成,对于第i个combo,如果他们都是魔法攻击,会额外增加AD_i的爆发力,如果他们都是物理攻击,会额外增加AP_i的爆发力,如果他们不属于同一类型,会减少AX_i的爆发力。她找到了你,请你帮她选择技能的类型,产生最大的爆发力。(说明:每个技能都必须学习)
【输入数据】
第一行2个正整数n,m,表示技能的个数和combo的个数
接下来n行每行2个正整数,描述一个技能的ap_i,ad_i
接下来m行每行5个正整数u,v,AD_i,AP_i,AX_i,描述一个combo,表示技能u和技能v产生combo
【输出数据】
一行,一个整数,表示最大的爆发力
【样例输入】
【样例输出】
【样例解释】
均选择魔法攻击,获得5+20+100=125的爆发力
【数据范围】
|
测试点编号 |
n |
m |
|
1 |
5 |
5 |
|
2 |
50 |
100 |
|
3 |
100000 |
0 |
|
4 |
500000 |
0 |
|
5-7 |
1000 |
3000 |
|
8-10 |
10000 |
40000 |
对于所有的测试点,确保不会爆long long
Solution
模型:最小割,最大权闭合子图
来自出题者的题解:可以先看作我们把所有的技能的收益(不包括亏损AX)都获得了,然后在这个获益中扣除最小的代价
建图:
对于每个技能,建边(S,u,ap),(u,T,ad)
对于每个combo,拆点,对点一建边(S,buf1,AD),(buf1,u,+∞),(buf1,v,+∞)
对点二建边(buf2,T,AP),(u,buf2,+∞),(v,buf2,+∞)
跑个最大流算法就行
#include<stdio.h>
#include<limits.h>
#include<string.h>
#define LL long long
#define dmin(a,b) ((a)<(b)?(a):(b))
inline int Rin(){
int x=,c=getchar(),f=;
for(;c<||c>;c=getchar())
if(!(c^))f=-;
for(;c>&&c<;c=getchar())
x=(x<<)+(x<<)+c-;
return x*f;
}
const int N=;
const int M=;
const LL LINF=LONG_LONG_MAX/*;
LL tot();
int n,m,S,T,ecnt=,fst[N+M*];
struct edge{
int u,v,nxt;
LL cap,flow;
}e[(*M+*N)*];
inline void link(int x,int y,LL w){
e[++ecnt].u=x;e[ecnt].v=y;
e[ecnt].cap=w;e[ecnt].flow=;
e[ecnt].nxt=fst[x];fst[x]=ecnt;
e[++ecnt].u=y;e[ecnt].v=x;
e[ecnt].cap=;e[ecnt].flow=;
e[ecnt].nxt=fst[y];fst[y]=ecnt;
}
bool vis[N+M*];
int num[N+M*],cur[N+M*],d[N+M*],p[N+M*],q[N+M*];
void bfs(){
int hd=,tl=;
q[]=T;d[T]=;vis[T]=true;
while(hd^tl){
int now=q[hd++];
for(int j=fst[now];j;j=e[j].nxt)
if(!vis[e[j].u] && e[j].cap>e[j].flow)
vis[e[j].u]=true,
d[e[j].u]=d[now]+,
q[tl++]=e[j].u;
}
}
inline LL Agument(){
LL a=LINF;
int x=T;
while(x^S)
a=dmin(a,e[p[x]].cap-e[p[x]].flow),
x=e[p[x]].u;
x=T;
while(x^S)
e[p[x]].flow+=a,
e[p[x]^].flow-=a,
x=e[p[x]].u;
return a;
}
LL ISAP(){
int x(S);
LL flow();
bfs();
for(int i=S;i<=T;i++)num[d[i]]++;
for(int i=S;i<=T;i++)cur[i]=fst[i];
while(d[S]<T){
if(!(x^T))
flow+=Agument(),
x=S;
bool advanced=false;
for(int j=cur[x];j;j=e[j].nxt)
if(e[j].cap>e[j].flow && d[x]==d[e[j].v]+){
advanced=true;
cur[x]=j;
p[e[j].v]=j;
x=e[j].v;
break;
}
if(!advanced){
int mn=T-;
for(int j=fst[x];j;j=e[j].nxt)
if(e[j].cap>e[j].flow)
mn=dmin(mn,d[e[j].v]);
if(--num[d[x]]==)break;
num[d[x]=mn+]++;
cur[x]=fst[x];
if(x^S)x=e[p[x]].u;
}
}
return flow;
}
int main(){
freopen("skill.in","r",stdin);
freopen("skill.out","w",stdout);
n=Rin(),m=Rin();
S=,T=n++m*+;
for(int i=;i<=n;i++){
LL ap=Rin(),ad=Rin();
tot+=ap+ad;
link(S,i+,ap);
link(i+,T,ad);
}
for(int i=;i<=m;i++){
int u=Rin(),v=Rin();
LL AP=Rin(),AD=Rin(),AX=Rin();
tot+=AP+AD;
link(u+,v+,AX);
link(v+,u+,AX);
link(S,n++i,AD);
link(n++i,u+,LINF);
link(n++i,v+,LINF);
link(n++i+m,T,AP);
link(u+,n++i+m,LINF);
link(v+,n++i+m,LINF);
}
printf("%I64d\n",tot-ISAP());
fclose(stdin);
fclose(stdout);
return ;
}
[模拟赛FJOI Easy Round #2][T3 skill] (最小割+最大权闭合子图(文理分科模型))的更多相关文章
- [模拟赛FJOI Easy Round #2][T1 sign] (模拟+求字符串重复字串)
[题目描述] 小Z在无意中发现了一个神奇的OJ,这个OJ有一个神奇的功能:每日签到,并且会通过某种玄学的算法计算出今日的运势.在多次试验之后,小Z发现自己的运势按照一定的周期循环,现在他找到了你,请通 ...
- [NOI.AC省选模拟赛3.31] 附耳而至 [平面图+最小割]
题面 传送门 思路 其实就是很明显的平面图模型. 不咕咕咕的平面图学习笔记 用最左转线求出对偶图的点,以及原图中每个边两侧的点是谁 建立网络流图: 源点连接至每一个对偶图点,权值为这个区域的光明能量 ...
- 第 45 届国际大学生程序设计竞赛(ICPC)亚洲网上区域赛模拟赛. A.Easy Equation (前缀和/差分)
题意:RT,给你四个数\(a,b,c,d\),求\(x+y+z=k\)的方案数. 题解:我们可以先枚举\(x\)的值,然后\(x+y\)能取到的范围一定是\([x,x+b]\),也就是说这个区间内每个 ...
- [jzoj 4528] [GDOI2019模拟2019.3.26] 要换换名字 (最大权闭合子图)
题目链接: https://jzoj.net/senior/#contest/show/2683/0 题目: 题解: 不妨枚举一个点,让两颗树都以这个点为根,求联通块要么点数为$0$,要么包括根(即联 ...
- 2018 ACM-ICPC 中国大学生程序设计竞赛线上赛 F题 Clever King(最小割)
2018 ACM-ICPC 中国大学生程序设计竞赛线上赛:https://www.jisuanke.com/contest/1227 题目链接:https://nanti.jisuanke.com/t ...
- GDOI模拟赛Round 1
GDOI模拟赛Round 1 数据结构 题目描述:给出一个长度为\(n\)的序列,支持两种操作: 1.对某段区间都加上一个数 2.给出\(p.k\),求下面表示式对\((10^9+7)\)取模 \[\ ...
- @省选模拟赛03/16 - T3@ 超级树
目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
随机推荐
- bzoj2132
最小割 套路最小割... 盗一波图 来自GXZ神犇 对于这样的图,我们要么割ai,bj,要么割bi,aj,要么割ai,ci+cj,aj,要么割bi,ci+cj,bj,然后这样建图跑最小割就行了 但这不 ...
- openstack dnsmasq
killall dnsmasq systemctl restart openstack-nova-compute /sbin/dnsmasq --conf-file=/var/lib/libvirt/ ...
- div标签的闭合检查
什么叫DIV标签有没有闭合呢?有<div>开头就应该有</div>来结尾闭合了.有时候写代码写 了<div>,忘记</div>结尾,谓之没有闭合也. 如 ...
- 【174】C#添加非默认字体
参考:C# WinForm程序安装字体或直接调用非注册字体 参考:百度知道 在Debug文件夹下面新建一个font的文件夹,然后将字体的文件复制到里面,使用的时候,直接调用字体文件! private ...
- C++中虚析构函数的作用 (转载)
转自:http://blog.csdn.net/starlee/article/details/619827 我们知道,用C++开发的时候,用来做基类的类的析构函数一般都是虚函数.可是,为什么要这样做 ...
- sql server使用维护计划定时备份完整数据库、差异数据库
我配置的是: 一个月执行一次完整备份数据库,删除三个月前备份文件.每天执行一次差异备份,删除一个月钱备份文件. 1.管理-维护计划 右键-新建维护计划 2.创建子计划 3.分别配置作业计划属性(执 ...
- Nginx(二) 反向代理&负载均衡
1.反向代理 当我们请求一个网站时,nginx会决定由哪台服务器提供服务,就是反向代理. nginx只做请求的转发,后台有多个tomcat服务器提供服务,nginx的功能就是把请求转发给后面的服务器, ...
- jQuery setInterval倒计时精确到毫秒
效果类似于:购物抢购倒计时-->在跳转N多个页面之后,倒计时间仍然正常显示. 思路: 结束时间是固定不变的(endTime),一直在改变的是当下的时间(curTime = new date()) ...
- qW3xT.2挖矿病毒处理方案
我遇到的是一款qW3xT.2的病毒,网上查了一下,好像是挖矿病毒.在此贴一下我找到的关于病毒的资料.这是我的服务器 这篇文章可谓是出自高手之笔,感觉说的很厉害,但是非专业人士的我有点看不懂,看个大概 ...
- liunx 用户切换 su sudo
liunx 用户操作#useradd test#passwd test 用户身份切换su 切换用户 需要知道切换用户的密码1.su [-lm] [-c命令] [username] #su -login ...