ABC396 E~G

news/2025/3/16 10:46:51/文章来源:https://www.cnblogs.com/biyimouse/p/18774644

E - Min of Restricted Sum

发现题目给的条件其实非常像图上的边,所以我们考虑按照 \((x, y, z)\) 的方式连无向边。可以发现这个图应该是由很多的联通块组成的,而每个联通块之间是相互独立的。并且对于 \(A_x \oplus A_y = Z\) 这样的式子如果知道了 \(A_x\)\(Z\) 就可以求出 \(A_y\)。因此我们考虑对于每个联通块,二进制拆位后选取联通块中的一个点初始赋值为 \(0\),然后 BFS 求出联通块中的其它值。如果我们发现这样做之后这一位联通块内 \(1\) 的数量更多,我们就将联通块内所有点的这一位 \(\oplus 1\),就取到了这一位的最小值。

const int N = 200010;
int n, m;
int h[N], e[N], ne[N], w[N], idx;
int d[N], vis[N], ans[N];
vector<int> p;void add(int a, int b, int c) {e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++;
} void bfs(int s) {queue<int> q; q.push(s);p.clear();vis[s] = true; p.push_back(s);while (q.size()) {int u = q.front(); q.pop();for (int i = h[u]; ~i; i = ne[i]) {int v = e[i];if (vis[v] && d[v] != (d[u] ^ w[i])) { puts("-1"); exit(0); }if (vis[v]) continue;d[v] = d[u] ^ w[i]; q.push(v); vis[v] = true;p.push_back(v);}}
} int main() {n = read(), m = read();memset(h, -1, sizeof h);while (m --) {int a = read(), b = read(), c = read();add(a, b, c); add(b, a, c);}rep(i, 1, n) {if (vis[i]) continue;bfs(i);int tmp = 0;rep(k, 0, 30) {int cnt = 0;for (auto x : p)if (d[x] >> k & 1) cnt ++;if (cnt > p.size() - cnt) tmp |= 1 << k;}for (auto x : p) ans[x] = d[x] ^ tmp;}rep(i, 1, n) printf("%d ", ans[i]);return 0;
}

F - Rotated Inversions

考虑一个数如果当前时间 \(k\) 等于 \(M - 1\),那它下一时间会变成 \(0\),就会影响贡献。考虑如果这个数变成 \(0\) 了,那么它的前面和它不相等的所有数都会比它大,就产生逆序对;它后面和它所有不相等的数在它等于 \(M - 1\) 时都比它小,现在都比它大,就会减少逆序对。所以我们只需要先求出 \(k = 0\) 时原序列的逆序对,然后维护一下贡献即可。

const int N = 1000010;
LL n, m;
LL a[N], ans, tr[N], w[N], cnt[N];void add(int x, LL k) {for (; x <= m; x += lowbit(x)) tr[x] += k;
}
LL query(int x) {LL res = 0;for (; x; x -= lowbit(x)) res += tr[x];return res;
}int main() {n = read(), m = read();rep(i, 1, n) a[i] = read();rep(i, 1, n) {w[m - a[i]] += i - 1 - cnt[a[i]];cnt[a[i]] ++; }memset(cnt, 0, sizeof cnt);fro(i, n, 1) {w[m - a[i]] -= n - i - cnt[a[i]];cnt[a[i]] ++;}// rep(i, 0, m - 1) cout << w[i] << ' ';fro(i, n, 1) {a[i] ++;ans += query(a[i] - 1); add(a[i], 1);} rep(k, 0, m - 1) {ans += w[k];printf("%lld\n", ans);}return 0;
}

G - Flip Row or Col

题目的操作相当于每次对一行或一列异或 \(1\)。下文为了方便称 \(n\) 为总行数,\(m\) 为总列数。

首先对于一行来说,如果不考虑列的操作,那么它可以选择整行操作也可以不操作。显然如果这一行有 \(cnt_i\)\(1\),并且 \(cnt_i > m - cnt_i\) ,那么我们肯定操作比不操作优。换句话说,在列操作确定的情况下,行 \(i\) 的最小贡献是 \(\min(cnt_i, m - cnt_i)\)

观察数据范围可以发现 \(M \leq 18\),显然很可以状压。所以我们把每行给压缩成 \(B_i\),同时所有列上的操作也可以用整数 \(X\) 来表示。此时我们要求 \(\underset{0 \leq X < 2^m}{\min}\{\sum_{i = 1}^{n} \min(\operatorname{popcount}(B_i \oplus X), m - \operatorname{popcount}(B_i \oplus X))\}\),其中 \(\operatorname{popcount}(x)\)\(x\) 的二进制中 \(1\) 的个数。

一个简单的方法是对于每个 \(X\) 都计算一遍,这样做是 \(O(n\times 2^m)\) 的,炸了。

我们考虑优化计算过程,令 \(f_{k, c, x}\) 表示 \(X\) 的值为 \(x\) 时,满足 \(\operatorname{popcount}(B_i \oplus x) = c\)\(0\leq B_i < 2^k\)\(B_i\) 个数。

转移:\(f_{k, c, x} \to f_{k + 1, c, x}\)\(f_{k, c, x \oplus 2 ^ k} \to f_{k + 1, c + 1, x}\),即分为第 \(k + 1\)\(B_i\) 是否等于 \(X\) 两种情况。

那么最终的答案就是 \(\underset{0\leq X < 2^m}{\min}\{\sum_{c = 0}^{m} \min(c, m - c) \times f_{m, c, X}\}\)

这么做的时间复杂度是 \(O(m^2 \times 2^m)\),注意到 DP 的第一维可以优化掉,所以空间是 \(O(m\times 2^m)\)

const int N = 200010, M = 20;
int n, m;
LL f[M][1 << M], b[N];int main() {n = read(), m = read();rep(i, 1, n) rep(j, 1, m) {char c; scanf(" %c", &c);if (c == '1') b[i] |= (1 << m - j);} rep(i, 1, n) f[0][b[i]] ++;rep(i, 0, m - 1)fro(j, i, 0)rep(k, 0, (1 << m) - 1)f[j + 1][k] += f[j][k ^ (1 << i)];LL ans = 1e18;rep(k, 0, (1 << m) - 1) {LL res = 0;rep(i, 0, m) res += min(i, m - i) * f[i][k];ans = min(ans, res);}printf("%lld\n", ans);return 0;
}

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

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

相关文章

Web前端入门第 21 问:CSS 最佳位置放在哪个标签中?

HELLO,这里是大熊的前端开发笔记。 先了解一个关键词 FCP (First Contentful Paint): 首次内容绘制,指的是浏览器渲染来自 DOM 的任何内容(包括文本、图像、SVG 等)的时间点。这是用户第一次看到页面上出现的内容,标志着页面开始有内容展示给用户。 使用 开发者工具 限制浏…

MiTS与PoTS:面向连续值时间序列的极简Transformer架构

原始"Attention Is All You Need"论文中提出的标准Transformer架构最初设计用于处理离散输入和输出序列标记(token),但将其应用于时间序列分析时,需要对模型结构进行适当调整以适应连续数据特性。本文详细阐述了使原始Transformer架构能够高效处理连续值时间序列数…

Cisco Secure Firewall Threat Defense Virtual 7.7.0 - 思科下一代防火墙虚拟设备 (FTDv)

Cisco Secure Firewall Threat Defense Virtual 7.7.0 - 思科下一代防火墙虚拟设备 (FTDv)Cisco Secure Firewall Threat Defense Virtual 7.7.0 - 思科下一代防火墙虚拟设备 (FTDv) Firepower Threat Defense (FTD) Software for ESXi & KVM 请访问原文链接:https://sysi…

Citrix Virtual Apps and Desktops 7 2411 - 应用程序和桌面虚拟化

Citrix Virtual Apps and Desktops 7 2411 - 应用程序和桌面虚拟化Citrix Virtual Apps and Desktops 7 2411 - 应用程序和桌面虚拟化 App and Desktop Virtualization | VDI 请访问原文链接:https://sysin.org/blog/citrix-virtual-apps-and-desktops/ 查看最新版。原创作品,…

闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器

需求背景 阿里云服务器到期了,正好家里有闲置的电脑,还有公网IP,打算装个linux服务器使用。本文章主要重点是实现远程连接虚拟机内服务器,打通网络连接,更多玩法大家可以自行探索。 ps: 公网IP自己向运营商申请,具体方法可以各大平台搜索下,本人是ipv4; 方案 本人是电信…

Ollama系列02:快速上手搭建私有的AI对话框和智能体—chatbox版

本文是Ollama系列教程的第2篇,在上一篇中我们介绍了Ollama的安装、大模型的下载和本地部署,本篇中我们将介绍如何将Ollama整合到chatBox中,并构建属于自己的智能体。 Ollama系列教程目录(持续更新中):Ollama系列教程01:轻松3步本地部署deepseekchatbox介绍ChatBox AI 是…

【操作系统习题】就绪、阻塞、执行态用户进程数量分析

一道理论课中有关用户进程三种状态数量的题目分析零、题目示例一、题目分析 1.1 前提条件 1.1.1 条件一:不考虑短期的进程调度切换什么是“短期进程调度切换”?调度器基于特定策略(如时间片耗尽等)​主动中断当前运行进程,将CPU分配给其他就绪进程的行为叫做“短期进程调…

9图看2025中国新质生产力发展举措

发展新质生产力,政府工作报告这样说: ①推动商业航天、低空经济等新兴产业安全健康发展 ②培育生物制造、量子科技、具身智能、6G等未来产业 ③促进专精特新中小企业发展壮大,支持独角兽企业、瞪羚企业发展 ④支持大模型广泛应用 ⑤大力发展智能网联新能源汽车、人工智能手机…

manim边学边做--三维图形的场景类

在Manim中,ThreeDScene是一个专门为三维场景设计的类。 它通过配置三维相机、支持复杂的相机运动以及管理物体与相机的交互关系,为科学可视化、工程仿真、数学教育等领域提供了强大的工具。 典型应用场景包括:三维几何图形的动态演示(如旋转立方体、莫比乌斯环) 物理过程的…

第三章 准确估算的价值

3.1 高估更好还是低估更好 3.1.1 反对高估的观点 管理人员和其他项目干系人有时会担心,如果项目被高估了,帕金森法则就会起作用——也就是所有可以用来完成工作的时间都会被浪费掉。因此,为了避免帕金森法则,某些管理人员会有意识地 "压缩" 这估算值。 另一个顾虑…

Windows中conda的安装与使用

下载安装miniconda 说明: Miniconda是一款管理python环境的软件工具 第一步:下载miniconda 代码如下: win+r后,输入cmd指令按回车 在终端中输入: curl https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-py39_4.12.0-Windows-x86_64.exe --output 按照…

CHT 另解

引入 CHT 又叫 凸包优化,是一种利用一次函数(斜率)来优化 Dp 的一种方法。 它的独特之处在于,传统斜率优化依靠的是一个一个的点,而凸包优化是利用一条条直线来优化,省去了一些码量。 我们用一道例题引入。 例1 HDU-3480 Dp 暴力 Link 题目是说,将 \(n\) 个数划分到 \(m…