2025.2.5 鲜花(抢先看)

news/2025/2/5 20:43:30/文章来源:https://www.cnblogs.com/xrlong/p/18700110

如何优雅的用反悔贪心思路做出模拟费用流(HZTG3003. 皮胚 题解)

待补

『抢先看』的意思是还没来得及找歌和图,等找了会重新发。

我不会费用流。

考虑贪心做这道题,首先显然的贪心是每次选最大的没匹配的边,也显然假。

考虑假的原因,发现其事实上可以通过交错路来匹配两个不相关的点,考虑将这样的点对之间连边当做是反悔策略,贡献就是和原来的差。

考虑到每个节点的度最多是 \(20\),正确性和复杂度都是有保证的,但是因为交错路是隔一条边选一条边,很难真正的维护出交错路形成的连通块的形状和叶子(度是一的点),也就很难做到直接将所有决策统计起来。

发现关键性质,\(k \le 200\),这给了我们暴力的机会,考虑每次枚举一条边,我们并不维护所有决策,我们只维护出从某个点出发跳交错路的最大贡献,这个暴力 dfs 跳交错路是容易的。

因为每次最多多选 \(1\) 条边,所以连通块大小也是 \(\mathcal{O}(k)\) 的,单次的复杂度就是 \(k ^ 2\),实现的时候可以先建出整个的图,将边黑白染色,然后暴力交替跳黑白色即可。

现在的复杂度是 \(2 ^ n n k ^ 2\),发现边数很多,但是只有 \(\mathcal{O}(n k)\) 条和交错路连通块相邻的边需要跑交错路,于是这部分我们暴力枚举交错路连通块里的点和与其相连的边来统计,其他边就依然放到堆里跑贪心。

注意到我们的交错路只和与交错路连通块相交的那个点有关,所以枚举边并不在复杂度上限。

发现这些放到堆里的边权值都不变,于是直接基排后用队列维护就可以了,复杂度 \(\mathcal{O}(2 ^ n n + k ^ 3 n)\),足以通过。

跳交错路相当于是退流,所以写出来和模拟费用流一模一样啦~

Code
#include <bits/stdc++.h>
using namespace std;
using llt = long long;
using ull = unsigned long long;
using llf = long double;
#define endl '\n'
#ifdef LOCAL
FILE *InFile = freopen("in_out/in.in", "r", stdin), *OutFile = freopen("in_out/out.out", "w", stdout);
#else
FILE *InFile = freopen("pp.in", "r", stdin), *OutFile = freopen("pp.out", "w", stdout);
#endifconst int LG = 20, N = (1 << LG) + 3;
int n, ck, clg, cv[N];
pair<int, int> ce[N * 10], *ft = ce + 1, *bk = ce + 1;struct Gph{int hd[N], nt[N * 20], to[N * 20], tot = 1; bool wt[N * 20];void Add(int u, int v, bool w){wt[++tot] = w, to[tot] = v, nt[tot] = hd[u], hd[u] = tot;}void ADD(int u, int v, int w){Add(u, v, w), Add(v, u, w);}
#define For_to(i, u, v, g) for(int i = g.hd[u], v = g.to[i]; i; i = g.nt[i], v = g.to[i]) 
} g;vector<int> nd;
bool vnd[N]; int clv, to[N], vis[N];
int aaa;
int Dfs(int u, bool l){++aaa;vis[u] = clv;if(!vnd[u]) return cv[u];int ma = -0x3f3f3f3f;For_to(i, u, v, g) if(vis[v] != clv && g.wt[i] != l)ma = max(ma, Dfs(v, l ^ 1));return ma;
}
int To(int u, bool l){vis[u] = clv;if(!vnd[u]) return cv[u];int ma = -0x3f3f3f3f;For_to(i, u, v, g) if(vis[v] != clv && g.wt[i] != l){int t = To(v, l ^ 1);if(ma < t)ma = t, to[u] = v;}return ma;
}
void Rev(int u, bool l){if(!vnd[u]){nd.emplace_back(u), vnd[u] = 1;return ;}For_to(i, u, v, g) if(v == to[u])Rev(v, l ^ 1), g.wt[i] ^= 1, g.wt[i ^ 1] ^= 1;
};int main(){ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);cin >> clg >> ck; n = 1 << clg;for(int i = 0; i < n; ++i)cin >> cv[i];{static pair<int, int> tp[N * 10]; int ct = 0;for(int u = 0; u < n; ++u)for(int j = 0; j < clg; ++j) if(u & (1 << j)){int v = u ^ (1 << j);g.ADD(u, v, 0);tp[++ct] = {u, v};}const int V = 2e6 + 3;static int tmp[V];for(int i = 1; i <= ct; ++i){auto &[u, v] = tp[i];++tmp[cv[u] + cv[v]];}for(int i = V - 3; ~i; --i)tmp[i] += tmp[i + 1];for(int i = ct; i; --i){auto &[u, v] = tp[i];ce[tmp[cv[u] + cv[v]]--] = tp[i];}bk += ct;}int ans = 0;memset(to, -1, sizeof to);for(int ccc = 1; ccc <= ck; ++ccc){while(ft != bk){auto [u, v] = *ft; if(vnd[u] || vnd[v]) ++ft;else break;}auto [eu, ev] = *ft;int ema = -1;if(ft != bk)ema = cv[eu] + cv[ev];int nma = 0, nu = 0, nv = 0;for(auto u : nd){int tp = Dfs(u, 0);For_to(i, u, v, g) if(!g.wt[i]){int t = tp + cv[v] * (!vnd[v]);if(t > nma)nma = t, nu = u, nv = v;++clv;}}if(max(nma, ema) <= 0) break;if(nma > ema){ans += nma;To(nu, 0), ++clv;Rev(nu, 0), ++clv;For_to(i, nu, v, g) if(v == nv)g.wt[i] = g.wt[i ^ 1] = 1;if(!vnd[nu])nd.emplace_back(nu), vnd[nu] = 1;if(!vnd[nv])nd.emplace_back(nv), vnd[nv] = 1;}else{ans += ema;++ft;For_to(i, eu, v, g) if(v == ev)g.wt[i] = g.wt[i ^ 1] = 1;nd.emplace_back(eu), nd.emplace_back(ev), vnd[eu] = vnd[ev] = 1;}}cout << ans << endl;
}
待补

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/879253.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Python的Selenium详细教程

本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0 需要你懂的技术:Python、HTML、CSS、JavaScript一、PyCharm安装配置Selenium本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0需要你懂的技术:Python、HTML、CSS、Java…

作业01

public class HomeWork01 {public static void main(String[] args) {int n1 = 13;int n2 = 17;int n3 = n1+n2;System.out.println("n3 = "+ n3);//30int n4 = 38;int n5 = n4-n3;System.out.println("n5 ="+n5);//8}}

CROS错误,xhr类型

解决方案:向Web.config里添加此项设置即可

2025省选模拟9

不知道啥2025省选模拟9 网络流专场是吧😅 Delov 的 npy 们 原题链接 一眼网络流,然后不会了。 发现正常顺着限制做做不了,考虑将限制转化一下,以 L 操作为例。 在 \(a_i\) 左侧的点中不超过 \(b_i\) 个,等价于从左往右数第 \(b_i+1\) 个点在 \(a_i\) 右侧。 但还是不好做…

海外社交媒体运营卡成狗?云手机一键“救场”

海外社交媒体运营卡成狗?云手机一键“救场” 在海外社交媒体运营中,运营人员往往会遇到各种挑战,导致运营效率低下,甚至感觉“卡成狗”。而云手机作为一种流行的成熟普及技术工具,可以为海外社交媒体运营带来一定的帮助,实现一键“救场”。以下是对云手机在海外社交媒体运…

MyBatis resultmap结果映射

创建数据库和实体类 首先创建数据库student和teacher,并且每个学生对应一个老师,一个老师可以对应多个学生,数据库如下图: 创建实体类Student1 package com.loubin.pojo;2 3 public class Student {4 private int id;5 private String name;6 7 Teacher teach…

Linguistics-English-Textbooks: 上海外教社: 高校英语专业系列教材(修订版)

新世纪高校英语专业系列教材(修订版) https://we.sflep.com/books/newcenturymajor1.aspx教材特色 配套资源 特点 秉以新《国标》指导下的英语专业课程改革为导向精心架构,体系完备。 凝聚海内外英语专业教育界专家学者智慧,教材编写高屋建瓴、深入 浅出. 兼顾语言基本技能…

OCRmyPDF: 让图片 PDF 可复制、搜索的神器

翻开十年前的工作报告,面对泛黄的纸质合同,整理成摞的文献资料 - 这些场景总离不开扫描仪,将纸张材料转成 PDF 扫描件电子版。 但生成的 PDF 文件像一张张定格照片,既不能复制文字,也无法搜索关键词。 图片 今天推荐的开源项目:OCRmyPDF 专治各种"哑巴PDF"。它…

10. 正则表达式

一、什么是正则表达式正则表达式(regular expression)又称 规则表达式,是一种文本模式(pattern)。正则表达式使用一个字符串来描述、匹配具有相同规格的字符串,通常被用来检索、替换那些符合某个模式(规则)的文本。正则表达式的核心功能就是处理文本。正则表达式并不仅…

独立开发经验谈:我是如何借助 Docker 环境变量让客户 1 分钟上线客服系统的

通过 Docker 环境变量,在启动容器时带入配置信息,自动写入配置文件中,完全免去了进入容器内部 vim 修改的步骤,真正实现在线客服系统1分钟上线。我在业余时间开发了一款自己的独立产品:升讯威在线客服与营销系统。陆陆续续开发了几年,从一开始的偶有用户尝试,到如今线上…

线段树详解

授人以鱼不如授人以渔本文尽量详细地讲述线段树的引入,实现,应用,以及相关进阶知识。 引入 引入线段树通用的例子: 给定一组整数\(nums\),定义两种操作修改列表里的第\(i\)个数据为\(val\) ①查询区间和\([L,R]\) ②为了同时实现两种操作,现在考虑处理\(nums\)的方式 简单…