首页 > 其他分享 >[国家集训队] happiness 题解

[国家集训队] happiness 题解

时间:2024-05-09 11:25:22浏览次数:19  
标签:cnt int 题解 ++ add ans 1e9 国家集训队 happiness

发现可以做如下建图:

  1. 对于前两组输入,从 \(s\) 向所有代表学生的点连一条边,容量为其学习文科的喜悦值;从所有代表学生的点向 \(t\) 连一条边,容量为其学习理科的最大值。

  2. 对于后四组输入,建两个点 \(x,y\),从 \(s\) 向 \(x\),从 \(y\) 向 \(t\) 分别连容量为相邻两人同时学文/理时额外喜悦值的一条边,\(x\) 向这两个学生各连一条无限长的边,这两个学生再向 \(y\) 连一条无限长的边。

直接拿总喜悦值减去最小割即可。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+5,M=5e6+5;
int n,m,s,t,k=1,h[N],d[N],cnt;
int c[N],to[M],nxt[M],w[M];
void add(int x,int y,int z){
	to[++k]=y;w[k]=z;
	nxt[k]=h[x];h[x]=k;
	to[++k]=x;w[k]=0;
	nxt[k]=h[y];h[y]=k;
}int bfs(){
    memset(c,-1,sizeof(c));
    queue<int>q;c[s]=0;
    q.push(s);d[s]=h[s];
    while(q.size()){
        int x=q.front();q.pop();
        for(int i=h[x];i;i=nxt[i]){
            int y=to[i];int lv=w[i];
            if(lv>0&&c[y]==-1){
                c[y]=c[x]+1;d[y]=h[y];
                q.push(y);if(y==t) return 1;
            }
        }
    }return 0;
}int dfs(int x,int ans){
    if(x==t) return ans;
    int sum=ans;
    for(int i=d[x];i&&sum;i=nxt[i]){
        d[x]=i;int y=to[i];int lv=w[i];
        if(lv<1||c[y]!=c[x]+1) continue;
        int zjy=dfs(y,min(sum,lv));
        sum-=zjy;w[i]-=zjy;w[i^1]+=zjy;
    }return ans-sum;
}int dinic(){
    int re=0;
    while(bfs())
        re+=dfs(s,1e9);
    return re;
}int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;t=100000;
	int ans=0;cnt=n*m;
	for(int i=1;i<=n;i++)
		for(int j=1,x;j<=m;j++)
			cin>>x,add(s,(i-1)*m+j,x),ans+=x;
	for(int i=1;i<=n;i++)
		for(int j=1,x;j<=m;j++)
			cin>>x,add((i-1)*m+j,t,x),ans+=x;
	for(int i=1;i<n;i++)
		for(int j=1,x;j<=m;j++){
			cin>>x;ans+=x;
			add(s,++cnt,x);
			add(cnt,(i-1)*m+j,1e9);
			add(cnt,i*m+j,1e9);
		}
	for(int i=1;i<n;i++)
		for(int j=1,x;j<=m;j++){
			cin>>x;ans+=x;
			add(++cnt,t,x);
			add((i-1)*m+j,cnt,1e9);
			add(i*m+j,cnt,1e9);
		}
	for(int i=1;i<=n;i++)
		for(int j=1,x;j<m;j++){
			cin>>x;ans+=x;
			add(s,++cnt,x);
			add(cnt,(i-1)*m+j,1e9);
			add(cnt,(i-1)*m+j+1,1e9);
		}
	for(int i=1;i<=n;i++)
		for(int j=1,x;j<m;j++){
			cin>>x;ans+=x;
			add(++cnt,t,x);
			add((i-1)*m+j,cnt,1e9);
			add((i-1)*m+j+1,cnt,1e9);
		}
	cout<<ans-dinic();
	return 0;
}

标签:cnt,int,题解,++,add,ans,1e9,国家集训队,happiness
From: https://www.cnblogs.com/chang-an-22-lyh/p/18181711/guoji-happiness_tj

相关文章

  • [题解]CF1907G Lights
    CF1907GLights我们可以把灯抽象成节点,而开关抽象成无向边(重边算作\(1\)条)。显然每个连通块要么是一棵树,要么是一棵基环树。对于基环树,我们把它看做若干棵树处理,最后我们再考虑如何处理环。如下图,这是一棵树,黄色的点表示亮灯。我们选定任意一条边,可以改变子节点和父节点的状......
  • CodeForces 1967D Long Way to be Non-decreasing 题解
    题意简述yzh喜欢单调不降序列。她有一个序列\(a\),最初为\(a_1,\ldots,a_n\),其中每个元素都在\([1,m]\)内。她希望使序列变得单调不降,为此,她有一个序列$b_1\ldotsb_m$,每个元素也在\([1,m]\)内。她可以进行若干次操作,一次操作定义为:选择一个集合\(S\subseteq......
  • CF1967C题解
    CF1906D这里更容易进入且有翻译题意对于数组\(a\),有函数\(f(a)\),设数组\(s=f(a)\),则对于每一个\(s_i\),都有:\[s_i=\left(\sum^{i}_{j=(i\operatorname{\&}(i-1))+1}{a_j}\right)\]其中\(\&\)表示按位与运算。对于一个正整数\(k\),函数\(f^k(a)\)定义如......
  • P10429 [蓝桥杯 2024 省 B] 拔河 题解
    思路通过动态规划计算出所有连续子序列的力量值之和,并将其存储在一个数组中然后排序,遍历一遍数组,找到相邻两个力量值之和的差的绝对值的最小值,然后输出这个答案就行了。时间复杂度大概是\(O(n^2\logn)\)。来个python的代码defmin_power_diff(n,a):#计算所有连续子序列......
  • 「高精度乘法+高精度加法」P10425 [蓝桥杯 2024 省 B] R 格式 题解
    解题思路题意分析:将浮点数乘以\(2^n\);四舍五入到最接近的整数。根据题意将\(d\times2^n\)分解为\(d\times2\times2\times2\times2……\),因为\(d\)长度小于等于\(1024\),所以可以使用高精度乘法的算法来实现一个小数乘以一个大于\(0\)的整数时,小数点位数本身不会......
  • [COCI2022-2023#1] Berilij 题解
    SolutionP9030[COCI2022-2023#1]Berilij本题解转载翻译自官方题解:COCI2022/2023CONTEST1Part1让我们定义图形\(G\),顶点代表飞船,边代表两艘飞船外部接触的情况。此外,让边的边权成为它所连接的圆之间的距离。现在的任务等同于为顶点找到非负值,使得每条边所连接的两个顶......
  • cuda使用时Could not locate zlibwapi.dll 问题解释和解决
    第一次配置cuda环境,python环境训练模型时,可能遇到Couldnotlocatezlibwapi.dll.Pleasemakesureitisinyourlibrarypath! 原因就是window系统里没有zlibwapi.dll.,与cuda没关系,cuda只是依赖它。安装某些软件时可能会自动把这个动态库安装到系统的某个path路径下,比如......
  • ICPC2024 武汉邀请赛 题解
    2024ICPCNationalInvitationalCollegiateProgrammingContest,WuhanSiteB-CountlessMeSolution显然,只能执行\(n\)次操作是没用的条件我们只需要把和\(sum\)分给\(n\)个数,使得\(n\)个数的或和最小即可从高到低考虑每一位,假设此时枚举到第\(i\)位如果这一......
  • 【题解】爬山 蓝桥杯2024省B
    题目链接:P10429[蓝桥杯2024省B]拔河[蓝桥杯2024省B]拔河题目描述小明是学校里的一名老师,他带的班级共有\(n\)名同学,第\(i\)名同学力量值为\(a_i\)。在闲暇之余,小明决定在班级里组织一场拔河比赛。为了保证比赛的双方实力尽可能相近,需要在这\(n\)名同学中挑选......
  • XMOJ 四月月赛 T3 旅行 题解
    我们首先尝试挖掘这个分组的性质。我们发现,我们可以把在同一个组的夫妻和不在同一个组的夫妻分开来处理。这里,分开之后我们只需要让一种情况有顺序,另外一种不能有顺序。如果两个没有顺序/有顺序的序列合并,一定会出现漏算/多算。所以为了方便,我们可以把第二种情况看作有顺......