尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

[eJOI 2024] 奶酪交易 / Cheese

[eJOI 2024] 奶酪交易 / Cheese
📅 发布时间:2026/6/18 20:36:17

前言:

译者的语文成绩不怎么样啊。

解题思路:

假设农夫 \(i\) 所拥有的奶酪价值为 \(p_{i}\)。

稍微细想一下 \(i\) 和 \(j\) 交易这件事,因为钱的面值只有 \(2\) 的次幂,所以 \(j\) 找 \(i\) 的钱的总面值一定是 \(B\) 的倍数,发现它实际上是想告诉我们:

\[p_{j}-p_{i}=A-k \times B \quad k \in \mathbb{Z} \]

\[p_{j}-p_{i} \equiv A \pmod{B} \]

在细想一下又能发现,我们不仅仅只知道 \(p_{j}-p_{i}\) 模 \(B\) 的值,小于 \(B\) 的值我们也能知道。所以一次交易相当于告诉我们 \(p_{j}-p_{i}\) 模所有小于 \(B\) 的面值的差值。

注意到 \(B\) 的面值不会大于 \(2^{15}\),所以我们直接开 \(16\) 个带权并查集,第 \(i\) 个并查集中记录 \(fa_{x}\) 表示 \(x\) 的父亲,\(val_{x}\) 表示 \(p_{x}\) 在模 \(2^i\) 的意义下减 \(p_{fa_{x}}\) 的差值。

每次交易只要查询 \(i\) 和 \(j\) 是否在并查集内是否有连边,差值是否正确即可。

\(x\) 所在的并查集和 \(y\) 所在的并查集合并的时候,我们知道的是 \(p_{x}\) 和 \(p_{y}\) 之间的差 \(k\),那么这两个并查集的根节点之间的边权应为 \(k-val[x]+val[y]\)。(这部分请根据具体实现自行推断)

同时注意路径压缩时,\(x\) 的父节点变了,\(val_{x}\) 的值也要变。

\(B=-1\) 其实是容易的,只要将 \(B\) 当作一个足够大的值做就行了。

代码实现:

#include<bits/stdc++.h>
#define endl '\n'
#define LL long long
using namespace std;
const int N = 5e5 + 10;
int n, m;
struct DSU{int fa[N];LL val[N], mod;int find(int x){if(fa[x] == x) return x;int fat = find(fa[x]);val[x] = (val[x] + val[fa[x]]);return fa[x] = fat;}bool check(int x, int y, LL k){int fatx = find(x), faty = find(y);if(fatx != faty) return 1;return (((val[x] - val[y]) % mod + mod) % mod == k);}void merge(int x, int y, LL k){int fatx = find(x), faty = find(y);if(fatx == faty) return;fa[fatx] = faty;val[fatx] = k + val[y] - val[x];}
}T[17];
signed main(){ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);cin >> n >> m;for(int j = 0; j <= 15; j++) T[j].mod = (1 << j);T[16].mod = 0x3f3f3f3f3f3f3f3f;for(int i = 1; i <= n; i++) for(int j = 0; j <= 16; j++) T[j].fa[i] = i;for(int i = 1; i <= m; i++){LL x, y, val, B;cin >> x >> y >> val >> B;if(B != -1){int k = log2(B);for(int i = k; i >= 0; i--) if(!T[i].check(x, y, val & (T[i].mod - 1))) goto failed;for(int i = k; i >= 0; i--) T[i].merge(x, y, val & (T[i].mod - 1));}else{int k = 15;if(!T[16].check(x, y, val)) goto failed;for(int i = k; i >= 0; i--) if(!T[i].check(x, y, val & (T[i].mod - 1))) goto failed;for(int i = k; i >= 0; i--) T[i].merge(x, y, val & (T[i].mod - 1));T[16].merge(x, y, val);}cout << 1 << endl; continue;failed: cout << 0 << endl;}return 0;
}

相关新闻

  • 若依前后端版本-综合QA
  • tests-stats/regression.sh
  • 计算机毕业设计-在线书城管理系统-计算机毕设辅导-源码-文档-全套资料 - 指南

最新新闻

  • MAX795TESA+T是一款8 脚工业级监控芯片 + 3.3V 系统 RAM 断电存储方案
  • 2026年6月三向土工格栅厂家推荐优质企业指南 - 多才菠萝
  • 2026年抚顺搬家公司选购指南:抚顺居民搬家、公司搬厂、空调移机服务厂家选择,服务、效率、口碑三维度解析 - 海棠依旧大
  • 深入解析PowerPC 601整数加载/存储指令:寻址模式与内存同步机制
  • 2026年6月玻纤土工格栅实力厂家推荐指南 - 多才菠萝
  • 如何永久保存你的微信聊天记忆?这个开源工具让珍贵对话永不丢失

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号