【题解】[国家集训队]happiness
\(\text{Solution:}\)
显然还是一个分组问题。对于理科和文科我们可以看出最小割模型,而处理同时选择某一学科的时候,需要我们根据套路建立虚点处理。
同 小M的作物 一题,这题只不过是组数多了一点。
笔者前几次\(\color{red}{\text{WA}}\)是因为汇点编号小了,值得反思与铭记……
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN=5e5+10;
int tot=1,head[5000010],Ans;
int cur[MAXN],dep[MAXN];
int n,m,S,T,id;
const int inf=(1LL<<60);
struct E{int nxt,to,flow;}e[5000100];
inline void add(int x,int y,int w){
e[++tot].to=y;e[tot].nxt=head[x];e[tot].flow=w;head[x]=tot;
e[++tot].to=x;e[tot].nxt=head[y];e[tot].flow=0;head[y]=tot;
}
bool bfs(int s,int t){
memset(dep,0,sizeof dep);
queue<int>q;q.push(s);
cur[s]=head[s];dep[s]=1;
for(;!q.empty();){
s=q.front();q.pop();
for(int i=head[s];i;i=e[i].nxt){
int j=e[i].to;
if(!dep[j]&&e[i].flow){
cur[j]=head[j];
dep[j]=dep[s]+1;
if(j==t)return true;
q.push(j);
}
}
}
return false;
}
int dfs(int s,int flow,int t){
if(flow<=0||s==t)return flow;
int rest=flow;
for(int i=cur[s];i;i=e[i].nxt){
int j=e[i].to;
if(dep[j]==dep[s]+1&&e[i].flow){
int tmp=dfs(j,min(rest,e[i].flow),t);
if(tmp<=0)dep[j]=0;
rest-=tmp;e[i].flow-=tmp;e[i^1].flow+=tmp;
if(rest<=0)break;
}
}
return flow-rest;
}
int dinic(int s,int t){
int ans=0;
for(;bfs(s,t);)ans+=dfs(s,inf,t);
return ans;
}
inline int pos(int i,int j){return (i-1)*m+j;}
inline int build(){return (++id);}
signed main(){
scanf("%lld%lld",&n,&m);
S=0,T=n*m+2*n*(m-1)+2*(n-1)*m+1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
int x;
scanf("%lld",&x);
Ans+=x;
add(S,pos(i,j),x);
}
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j){
int x;
scanf("%lld",&x);
Ans+=x;
add(pos(i,j),T,x);
}
id=n*m;
for(int i=1;i<n;++i)
for(int j=1;j<=m;++j){
int P=build(),x;
scanf("%lld",&x);
Ans+=x;
add(S,P,x);
add(P,pos(i,j),inf);
add(P,pos(i+1,j),inf);
}
for(int i=1;i<n;++i)
for(int j=1;j<=m;++j){
int x,P=build();
scanf("%lld",&x);
Ans+=x;
add(P,T,x);
add(pos(i,j),P,inf);
add(pos(i+1,j),P,inf);
}
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j){
int P=build(),x;
scanf("%lld",&x);
Ans+=x;
add(S,P,x);
add(P,pos(i,j),inf);
add(P,pos(i,j+1),inf);
}
for(int i=1;i<=n;++i)
for(int j=1;j<m;++j){
int P=build(),x;
scanf("%lld",&x);
Ans+=x;
add(P,T,x);
add(pos(i,j),P,inf);
add(pos(i,j+1),P,inf);
}
printf("%lld\n",Ans-dinic(S,T));
return 0;
}
【题解】[国家集训队]happiness的更多相关文章
- 题解-[国家集训队]Crash的数字表格 / JZPTAB
题解-[国家集训队]Crash的数字表格 / JZPTAB 前置知识: 莫比乌斯反演 </> [国家集训队]Crash的数字表格 / JZPTAB 单组测试数据,给定 \(n,m\) ,求 ...
- [国家集训队]happiness
嘟嘟嘟 就这么建. --- #include<cstdio> #include<iostream> #include<cmath> #include<algo ...
- [国家集训队]happiness 最小割 BZOJ 2127
题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...
- BZOJ 2127 / Luogu P1646 [国家集训队]happiness (最小割)
题面 BZOJ传送门 Luogu传送门 分析 这道题又出现了二元关系,于是我们只需要解方程确定怎么连边就行了 假设跟SSS分在一块是选文科,跟TTT分在一块是选理科,先加上所有的收益,再来考虑如何让需 ...
- luogu P1646 [国家集训队]happiness (最小割)
高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文科或者理科 ...
- happiness[国家集训队2011(吴确)]
[试题来源] 2011中国国家集训队命题答辩 [问题描述] 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科 ...
- 【题解】P1407国家集训队稳定婚姻
[题解][P1407 国家集训队]稳定婚姻 很好的一道建模+图论题. 婚姻关系?很像二分图匹配呀,不过不管怎么办先建模再说.婚姻关系显然用图方面的知识解决.建图! 它给定的是字符串,所以我们使用\(a ...
- P2634 [国家集训队]聪聪可可(题解)(点分治)
P2634 [国家集训队]聪聪可可(题解)(点分治) 洛谷题目 #include<iostream> #include<cstdlib> #include<cstdio& ...
- 【题解】国家集训队礼物(Lucas定理)
[国家集训队]礼物(扩展Lucas定理) 传送门可以直接戳标题 172.40.23.20 24 .1 答案就是一个式子: \[ {n\choose \Sigma_{i=1}^m w}\times\pr ...
随机推荐
- vue 使用 sass 或者 less ( vue-cli 3 )
项目使用 vue-cli 3 在项目中使用 sass npm install sass-loader --save -D cnpm install sass-loader --save -D ...
- The Triangle (简单动态规划)
7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure 1 shows a number triangle. Write a program that calc ...
- 编程体系结构(01):Java编程基础
一.数据类型 1.基础类型 整型:byte .short .int .long 浮点型:float.double 字节型:char 2.包装类型 Byte,Short,Integer,Long Flo ...
- django学习(三)
1.单表操作和测试环境的准备 我们先对单表查询做一个总结和回顾,并进行进一步的学习和交流.我们在我们的应用的models.py文件下面书写user类.如下所示,然后用数据库迁移,在mysql数据库中生 ...
- agumaster 出现实际股票数据
工程下载:https://files.cnblogs.com/files/xiandedanteng/agumaster20200430-3.zip --2020-04-30--
- C#开发PACS医学影像处理系统(二):界面布局之菜单栏
在菜单栏布局上,为了使用自定义窗体样式和按钮,我们需要先将窗体设置为无边框,然后添加一个Grid作为菜单栏并置顶,VerticalAlignment="Top" logo图片和标题 ...
- 不光是查找值!"二分搜索"
从有序数组中查找某个值 问题描述:给定长度为n的单调不下降数列a0,…,an-1和一个数k,求满足ai≥k条件的最小的i.不存在则输出n. 限制条件:1≤n≤1060≤a0≤a1≤…≤an-1< ...
- selenuim常用api
1.通过代码跳转到页面的方法:前提:已安装驱动,并加入到path下 安装ie驱动或火狐驱动的情况: 2.当链接跳转按钮在页面最上方时,用window.scrollTo(0,0);显示在页面最上方后,再 ...
- 记tp5.1使用composer PhpOffice的xlsx表格文件导入数据库
在项目环境下composer require phpoffice/phpspreadsheet在项目中引用use PhpOffice\PhpSpreadsheet\IOFactory; 下面是 上传x ...
- JUC使用
1.什么是JUC 源码 + 官方文档 面试高频问! java.util 工具包.包.分类 业务:普通的线程代码 Thread Runnable 没有返回值.效率相比入 Callable 相对较低! 2 ...