当前位置: 首页 > news >正文

AT_abc451_g Minimum XOR Walk Sol

前置题目:P4151| 题解。

也是在 ABC 尝到 WC 的菜了。

先套路的使用 P4151 的结论,可以发现环的贡献依然可以任意加到答案中,链也是可以任意选择的。

猜你想看
这里说明一下上面的是什么意思。考虑先建出 dfs 树,然后的话从 \(u\)\(v\) 的路径可以转化为树上从 \(u\)\(v\) 的链以及若干个环。可以证明我们能够任意增加一个环的贡献。
可以选择任意的链,是因为两个链会形成一个环,我们可以通过链异或环得到另一个链。

但是这需要我们求出所有的链,还是不可行的。但是这里我们有结论,设 \(dis_u,dis_v\) 表示 \(u,v\) 到根的最短距离,\(r_u\)\(r_v\) 表示通过线性基求得的最小异或和。则有 \({dis_{u,v}}_{min}=r_u \oplus r_v\)

证明:假设 \(r_u \oplus r_v\) 在第 \(k\) 位上为 1 使得答案不是最小的,则有 \(r_u,r_v\) 必有一个在第 \(k\) 位上为 1,然而与前面的最小矛盾了!因此结论正确。

Code

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false);cin.tie(0),cout.tie(0)
#define File(s) freopen(s".in","r",stdin);freopen(s".out","w",stdout)
#define LL long long
#define fi first
#define se second
const int M = 60,N = 2e5 + 10;
struct xor_basis{LL a[M];void clear(){for(int i=M-1;i>=0;i--) a[i] = 0;}void insert(LL x){for(int i=M-1;i>=0;i--){if(x == 0) return ;if(((x >> i) & 1) && (a[i] == 0)){a[i] = x;return ;}else if((x >> i) & 1) x ^= a[i];}}LL query(LL x){for(int i=M-1;i>=0;i--)x = min(x,x^a[i]);return x;}
}xb;
struct Trie{int tot;struct node{int ch[2];LL cnt;}tre[N * 60];void clear(){for(int i=0;i<=tot;i++)tre[i].ch[0] = tre[i].ch[1] = tre[i].cnt = 0;tot = 0;}void insert(LL x){int u = 0;tre[u].cnt ++ ;for(int i=M-1;i>=0;i--){int fh = (x >> i) & 1;if(tre[u].ch[fh] == 0) tre[u].ch[fh] = ++tot;u = tre[u].ch[fh];tre[u].cnt ++ ;}}LL query(LL x,LL lim){LL sum = 0;int u = 0;for(int i=M-1;i>=0;i--){int fh = (x >> i) & 1;int fh2 = (lim >> i) & 1;if(fh2){if(tre[u].ch[fh]) sum += tre[tre[u].ch[fh]].cnt;if(tre[u].ch[fh^1])u = tre[u].ch[fh^1];else break;}else{if(tre[u].ch[fh]) u = tre[u].ch[fh];else break;}if(i == 0)sum += tre[u].cnt;}return sum;}
}trie;
vector< pair<int,LL> > G[N];
int n,m;
LL lim;
bool vis[N];
LL dep[N];
void init(){xb.clear();trie.clear();for(int i=1;i<=n;i++) {G[i].clear();dep[i] = vis[i] = 0;}
}
void dfs(int u,LL res){vis[u] = 1;dep[u] = res;for(auto [v,w] : G[u]){if(vis[v]) xb.insert(dep[v]^res^w);else dfs(v,res^w);}
}
void solve(){init();cin >> n >> m >> lim;for(int i=1;i<=m;i++){int u,v;LL w;cin >> u >> v >> w;G[u].push_back({v,w});G[v].push_back({u,w});}dfs(1,0);LL ans = 0;for(int i=1;i<=n;i++){LL x = xb.query(dep[i]);ans += trie.query(x,lim);trie.insert(x);}cout << ans << "\n";
}
int main(){IOS;int T;cin >> T;while(T -- ) solve();return 0;
}
http://www.gsyq.cn/news/1332970.html

相关文章:

  • 【FFmpeg实战】从零到一:手把手搭建直播推拉流全链路(服务器部署+ffmpeg推流+ffplay/ffmpeg拉流)
  • Android硬件访问权限深度解析:从SELinux到Binder的系统级安全实践
  • 鸿蒙PC三方库和命令行工具迁移实战--直播PPT
  • 如何快速为代码生成软著文档:Flutter版智能工具终极指南
  • 避开MATLAB滤波器设计的坑:深入解读‘陡度’和‘阻带衰减’对实际信号的影响
  • 别再手动调间距了!用这个技巧让IEEE LaTeX模板的作者信息自动对齐
  • RK3576边缘计算平台人脸识别全链路实战:从模型选型到工程部署优化
  • 解锁NAS-Tool插件生态:手把手教你配置自定义索引与刷流规则
  • 第二卷第4章:里式替换原则介绍
  • 2026年京东云OpenClaw/Hermes Agent配置Token Plan步骤全解
  • 2026合肥黄金回收价格多少钱一克?附近黄金回收靠谱商家推荐。 - 资讯速览
  • 2024年Java开发者必看:这些过时技术可战略性放弃
  • 别再为Gurobi学术许可发愁了!手把手教你从申请到激活(附学信网报告攻略)
  • 2026年全球沥青搅拌设备与厂拌热再生技术选购指南:铁拓机械等主流方案深度对比 - 资讯快报
  • STM32图像识别实战:从传统CV到TinyML的边缘AI部署
  • 为什么很多企业,后期都会放弃“功能型商城系统”?——真正能支撑企业长期发展的,从来不是“功能更多”,而是“系统长期可治理”
  • 龙芯2k1000LA实战:从零部署Loongnix系统与核心外设驱动配置
  • 2026年鄂尔多斯市潍柴原装发电机组厂家最新推荐 - 品牌推广大师
  • 告别开机慢和数据丢失:为你的RK3588 Android设备优化Data分区(关闭加密+换文件系统)
  • 2026年昆明市金表回收机构推荐top榜单 - 品牌推广大师
  • 高性能本地 AI Agent 工作流架构手册:Hermes Agent + Qwen3.6 组合部署
  • 基于51单片机的数字频率计设计与误差优化实践
  • 电商数据实时采集系统:Kafka+Flink 的流式处理架构
  • 别再暴力搜索了!PTA L1-005 考试座位号的三种高效解法(C语言实现)
  • 通过 Node js 后端服务接入 Taotoken 多模型 API 的配置指南
  • 线缆一线品牌权威盘点:2026年5月行业五大卓越品牌采购参考 - 资讯快报
  • 2026 孝感黄金回收实用攻略行情数据正规门店指南,315权威背书 - 鑫顺黄金回收
  • ViLBERT:从单模态到多模态,Transformer如何打通视觉与语言的“任督二脉”?
  • 别再死记硬背了!用这5个jQuery实战小项目(含源码)搞定educoder实训作业
  • 从布料模拟到地形重建:CSF点云地面滤波算法原理解析