题目

建图很妙,不会。


考虑每一对要求合法的巫师(x,y),他们两个的\(a\)必须都大于\(min(b_x,b_y)\)。所以在输入的时候,如果\(a_x\)或者\(a_y\)小于\(min(b_x,b_y)\),可以先把\(a_x\)和\(a_y\)提升到\(min(b_x,b_y)\)(以后的a数组都指做过这步操作的)。接下来如果\(max(a_x,a_y)\geq max(b_x,b_y)\),那么这一对已经符合要求,可以直接不管。接下来只考虑需要管的。

发现每一对需要管的(x,y),两个巫师中有且仅有一个满足\(a<b\)。因此可以把所有需要管的(x,y)涉及到的巫师分成左右两组,左边的\(a<b\),右边的\(a \geq b\)。把每一对(x,y)都当成连接x,y的无向边,发现连成了一张二分图。把左边的点称为X类点,右边的称为Y类点。现在我们想让每一个X类点i满足:\(b_i \leq max(a_i,max_{j和i相邻}a_j)\),容易发现这与原题的要求等价。

提升X类点和Y类点的strength分别有什么用呢?发现提升一个X类点i,只对i自己有用,也就是使得\(a_i \geq b_i\),因为它的所有相邻的点j都是Y类点,都已经满足了\(a_j\geq b_j\)。提升一个Y类点则可能会帮助满足相邻的X类点的要求

考虑最小割。对每一个X类点i建立一个点\(c_i\),对于每一个Y类点i和一个[1,100]的整数j建立一个点\(d_{i,j}\)。从源点向每一个\(c_i\)连\(b_i-a_i\)的边,割掉这条边意味着点i的要求靠提升\(a_i\)满足;从每一个\(d_{i,j}向d_{i,j-1}连inf的边\);每一个\(d_{i,j}\)向汇点连边,\(j\leq a_i\)则流量为0,否则为1。最后,对于每一对(x,y),从\(c_x\)向\(d_{y,b_x}\)连inf的边。这个图的最小割加上输入的时候提升的值就是答案。

正确性证明:发现对于每条最后一种类型的边,这条边是不会割的,为了保证没有剩余流量,要么\(s \to c_x\)的边被割掉,代表提升\(a_x\)来满足要求;要么割掉\(d_{y,p}(p \leq b_x)\)到t的所有边(根据建图,这些边的代价和为\(b_x-a_y\)),代表\(a_y\)至少为\(b_x\)。证毕。

时间复杂度:O(能过)​。

点击查看代码
#include <bits/stdc++.h>

#define rep(i,n) for(int i=0;i<n;++i)
#define repn(i,n) for(int i=1;i<=n;++i)
#define LL long long
#define pii pair <int,int>
#define pb push_back
#define fi first
#define se second
#define mpr make_pair using namespace std; struct node
{
LL to,flow,rev;
node(LL a,LL b,LL c):to(a),flow(b),rev(c){}
};
namespace maxFlow
{
LL n,dist[100010],cur[100010];
vector <node> g[100010];
queue <LL> q;
void add_edge(LL x,LL y,LL z)
{
g[x].pb(node(y,z,g[y].size()));
g[y].pb(node(x,0,g[x].size()-1));
}
void bfs(LL s)
{
rep(i,n+5) dist[i]=-1;
dist[s]=0;q.push(s);
while(!q.empty())
{
int f=q.front();q.pop();
rep(i,g[f].size())
{
if(dist[g[f][i].to]!=-1||g[f][i].flow==0) continue;
dist[g[f][i].to]=dist[f]+1;
q.push(g[f][i].to);
}
}
}
LL dfs(LL pos,LL t,LL flow)
{
if(pos==t) return flow;
for(int i=cur[pos];i<g[pos].size();++i,++cur[pos])
{
if(g[pos][i].flow==0||dist[g[pos][i].to]!=dist[pos]+1) continue;
LL flow2=dfs(g[pos][i].to,t,min(flow,g[pos][i].flow));
if(flow2>0)
{
g[pos][i].flow-=flow2;
g[g[pos][i].to][g[pos][i].rev].flow+=flow2;
return flow2;
}
}
return 0;
}
LL max_flow(LL s,LL t)
{
LL ret=0;
while(true)
{
bfs(s);
if(dist[t]==-1) return ret;
rep(i,n+5) cur[i]=0;
while(true)
{
LL add=dfs(s,t,1e12);
if(add==0) break;
ret+=add;
}
}
}
} int n,m,a[110],b[110],x[10010],y[10010],ans=0,X[110],Y[110][110],len=0,ss,tt;
bool isx[110],isy[110];
vector <pii> need; int main()
{
cin>>n;
rep(i,n) scanf("%d%d",&a[i],&b[i]);
cin>>m;
rep(i,m)
{
scanf("%d%d",&x[i],&y[i]);--x[i];--y[i];
int least=min(b[x[i]],b[y[i]]);
if(a[x[i]]<least) ans+=least-a[x[i]],a[x[i]]=least;
if(a[y[i]]<least) ans+=least-a[y[i]],a[y[i]]=least;
}
rep(i,m)
{
if(max(a[x[i]],a[y[i]])>=max(b[x[i]],b[y[i]])&&min(a[x[i]],a[y[i]])>=min(b[x[i]],b[y[i]])) continue;
if(b[y[i]]>a[y[i]]) swap(x[i],y[i]);
need.pb(mpr(x[i],y[i]));
isx[x[i]]=true;isy[y[i]]=true;
}
ss=++len;tt=++len;
rep(i,n)
{
if(isx[i])
{
X[i]=++len;
maxFlow::add_edge(ss,X[i],b[i]-a[i]);
}
else if(isy[i])
{
repn(j,100) Y[i][j]=++len;
repn(j,100)
{
if(j+1<=100) maxFlow::add_edge(Y[i][j+1],Y[i][j],1e12);
maxFlow::add_edge(Y[i][j],tt,(j<=a[i] ? 0:1));
}
}
}
rep(i,need.size()) maxFlow::add_edge(X[need[i].fi],Y[need[i].se][b[need[i].fi]],1e12);
maxFlow::n=len;
ans+=maxFlow::max_flow(ss,tt);
cout<<ans<<endl;
return 0;
}

[题解] Atcoder ARC 142 E Pairing Wizards 最小割的更多相关文章

  1. [题解] Atcoder ARC 142 D Deterministic Placing 结论,DP

    题目 (可能有点长,但是请耐心看完,个人认为比官方题解好懂:P) 首先需要注意,对于任意节点i上的一个棋子,如果在一种走法中它走到了节点j,另一种走法中它走到了节点k,那么这两种走法进行完后,棋子占据 ...

  2. 【题解】 bzoj3894: 文理分科 (网络流/最小割)

    bzoj3894,懒得复制题面,戳我戳我 Solution: 首先这是一个网络流,应该还比较好想,主要就是考虑建图了. 我们来分析下题面,因为一个人要么选文科要么选理科,相当于两条流里面割掉一条(怎么 ...

  3. AtCoder AGC038F Two Permutations (网络流、最小割)

    题目链接 https://atcoder.jp/contests/agc038/tasks/agc038_f 题解 好题. 首先观察到一个性质,对于排列\(P\), 其所形成的每个轮换中的点\(A_i ...

  4. bzoj2132: 圈地计划(无比强大的最小割)

    2132: 圈地计划 题目:传送门 简要题意: 给出一个矩阵,一共n*m个点,并给出三个收益矩阵.A矩阵表示这个点建A的可取收益,B矩阵表示这个点建B的可取收益,C矩阵表示如果相邻(有且仅有一条公共边 ...

  5. Atcoder Regular Contest 125 E - Snack(最小割转化+贪心)

    Preface: 这是生平第一道现场 AC 的 arc E,也生平第一次经历了 performance \(\ge 2800\)​,甚至还生平第一次被 hb 拉到会议里讲题,讲的就是这个题,然鹅比较尬 ...

  6. Atcoder Grand Contest 038 F - Two Permutations(集合划分模型+最小割)

    洛谷题面传送门 & Atcoder 题面传送门 好久前做的题了--今天偶然想起来要补个题解 首先考虑排列 \(A_i\) 要么等于 \(i\),要么等于 \(P_i\) 这个条件有什么用.我们 ...

  7. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  8. 洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication【最小割】分析+题解代码

    洛谷P1345 [USACO5.4]奶牛的电信Telecowmunication[最小割]分析+题解代码 题目描述 农夫约翰的奶牛们喜欢通过电邮保持联系,于是她们建立了一个奶牛电脑网络,以便互相交流. ...

  9. 【bzoj1001】【最短路】【对偶图】【最大流转最小割】狼抓兔子题解

    [BZOJ1001]狼抓兔子 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 18872  Solved ...

随机推荐

  1. 阻塞赋值-非阻塞赋值(LUT,FDC,BUF...)

    一.看RTL级综合网络 1.1 FDC FDPE FDRE FDSE均是XILINX FPGA片上资源中四种不同的触发器,具体功能可直接百度 1.2 LUT是实现组合逻辑功能的一张真值表,根据输入值直 ...

  2. CF1703B ICPC Balloons 题解

    题意:输入每个团队及团队的解决问题数,若是第一次解决则获得两个气球,其余获得一个气球. 做法:开一个数组记录是否为第一次解决该问题,直接模拟. #include<cstdio> #incl ...

  3. CF1701A Grass Field 题解

    根据题意,给定一个 \(2\times2\) 的仅包含 \(0\) 和 \(1\) 的二维数组.定义一个操作,每次可以选择一行和一列将其变成 \(0\),求最小操作次数. 思路:根据枚举可得共有 \( ...

  4. k8s配置集ConfigMap详解

    ConfigMap介绍 ConfigMap和Secret是Kubernetes系统上两种特殊类型的存储卷,ConfigMap对象用于为容器中的应用提供配置文件等信息.但是比较敏感的数据,例如密钥.证书 ...

  5. python shutil相关操作

    python shutil模块常用操作 高级的 文件.文件夹.压缩包 处理模块 1.将文件内容拷贝至另一个文件中 shutil.copyfileobj(src, dist, length=16*102 ...

  6. Win10系统下搭建Go lang开发环境更换国内源并且体验宇宙最快框架Iris

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_156 最近有同学开始尝试接触Go lang,拥抱新技术永远都会是一个好习惯,之前的一篇文章介绍了如何在Mac os系统下配置Go ...

  7. Odoo14 groups && rule

    # Odoo14 groups && rule # admin账户以及权限的来源: # admin创建代码在:odoo/odoo/addons/base/data/res_users_ ...

  8. Luogu2922 [USACO08DEC]秘密消息Secret Message (Trie树)

    统计以节点\(i\)结尾的数量与经过的数量 #include <iostream> #include <cstdio> #include <cstring> #in ...

  9. Luogu3904 三只小猪 (组合数学,第二类斯特林数,高精)

    即使\(n<=50\),斯特林数也会爆long long. #include <iostream> #include <cstdio> #include <cstr ...

  10. 长篇图解java反射机制及其应用场景

    一.什么是java反射? 在java的面向对象编程过程中,通常我们需要先知道一个Class类,然后new 类名()方式来获取该类的对象.也就是说我们需要在写代码的时候(编译期或者编译期之前)就知道我们 ...