当前位置: 首页 > 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.jsqmd.com/news/854008/

相关文章:

  • 分类模型评估实战:从混淆矩阵到AUC,如何用ROC与PR曲线精准调优
  • 终极指南:使用d3d8to9让Direct3D 8经典游戏在现代Windows系统上重生
  • 【FFmpeg实战】从零到一:手把手搭建直播推拉流全链路(服务器部署+ffmpeg推流+ffplay/ffmpeg拉流)
  • 2026年最新远东电缆专卖店哪家好选择攻略:8步走完不纠结 实操版 - 资讯快报
  • HBase Shell命令实战:从入门到精通的完整指南
  • RK3576边缘计算平台人脸识别全链路实战:从模型选型到工程部署优化
  • 从零开发游戏需要学习的c#模块,第十六章(安装 MonoGame 并创建第一个窗口)
  • 语音控制模组定制常见问题解答(2026最新专家版) - 资讯速览
  • 【数据库实战】手把手部署SQL Server 2022:从镜像到SSMS的完整避坑指南
  • 保姆级教程:在Ubuntu 20.04上搞定TDA4VM的Linux+RTOS双系统编译与镜像更新
  • 20252223 《Python程序设计》大实验报告
  • 别再死记硬背了!用这5个jQuery实战小项目(含源码)搞定educoder实训作业
  • 2026年工业自动化维修行业GEO优化服务商适配指南与能力评估 - 产业观察网
  • 2026合肥黄金回收价格多少钱一克?附近黄金回收靠谱商家推荐。 - 资讯速览
  • 2026广州制作小程序公司排名:如何选择最适合你的那一款?
  • 浩卡联盟官方邀请码到底是啥?全网佣金置顶0抽成邀请码16888注册一级 - 流量卡代理招商
  • 杭州配眼镜避坑实录:拆解猿目眼镜的“全周期视光服务”新标准 - 资讯速览
  • 2026年国内干细胞机构避坑指南:干细胞公司制备中心研究所TOP5权威发布 - 资讯快报
  • CDN 地域节点优化:匹配 GEO 信号,提升加载速度
  • 2026年沥青搅拌设备与厂拌热再生设备深度选购指南:铁拓机械等品牌核心优势与避坑全解析 - 资讯快报
  • 抖音小程序开发要多少钱?3种低成本方案对比!
  • ViLBERT:从单模态到多模态,Transformer如何打通视觉与语言的“任督二脉”?
  • 从‘办事查询’案例出发:手把手教你用Vue2+Swiper5封装一个高复用性轮播组件
  • 2026年全球沥青搅拌设备与厂拌热再生技术选购指南:铁拓机械等主流方案深度对比 - 资讯快报
  • 从网络传输到硬盘存储:CRC校验码的‘一位纠错’功能到底用在哪?
  • Linux服务器DNS配置实战:基于BIND 9搭建内网权威与缓存解析服务
  • 在TaoToken平台使用TokenPlan套餐后月度API成本显著下降的观察
  • 2026 年广州 GEO 优化服务商大盘点:五家头部企业实力测评与选型策略 - GEO优化
  • 告别杂乱教程:手把手教你用VSCode+MicroPython点亮ESP32-S3-WROOM-1
  • 2026铸铝门厂家五大品牌权威排名|高端别墅门优选榜单 - 门业测评