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

并查集(非连通性问题)——# P2391 白雪皑皑

P2391 白雪皑皑

题目背景

“柴门闻犬吠,风雪夜归人”,冬天,不期而至。千里冰封,万里雪飘。空中刮起了鸭毛大雪。雪花纷纷,降落人间。 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼。但是 pty 却不高兴,他不喜欢白色的世界,他觉得这样太单调了。所以他想对雪花进行染色,让世界变得多彩些。

题目描述

现在有nnn片雪花排成一列。 pty 要对雪花进行mmm次染色操作,第iii次染色操作中,把第((i×p+q) mod n)+1((i\times p+q)\bmod n)+1((i×p+q)modn)+1片雪花和第((i×q+p) mod n)+1((i\times q+p)\bmod n)+1((i×q+p)modn)+1片雪花之间的雪花(包括端点)染成颜色iii。其中p,qp,qp,q是给定的两个正整数。他想知道最后nnn片雪花被染成了什么颜色。没有被染色输出000

输入格式

输入共四行,每行一个整数,分别为n,m,p,qn,m,p,qn,m,p,q,意义如题中所述。

输出格式

输出共nnn行,每行一个整数,第iii行表示第iii片雪花的颜色。

输入输出样例 #1

输入 #1

4 3 2 4

输出 #1

2 2 3 0

说明/提示

  • 对于20%20\%20%的数据满足:n,m≤1000n,m\leq 1000n,m1000
  • 对于40%40\%40%的数据满足:n≤8000n\leq 8000n8000m≤106m\leq 10^6m106
  • 对于80%80\%80%的数据满足:n≤5×105n\leq 5\times 10^5n5×105m≤107m\leq 10^7m107
  • 对于100%100\%100%的数据满足:1≤n≤1061\leq n\leq 10^61n1061≤m≤1071\leq m\leq 10^71m107

保证1≤m×p+q,m×q+p≤2×1091\leq m\times p+q,m\times q+p\leq 2\times 10^91m×p+q,m×q+p2×109

代码

#include<bits/stdc++.h>usingnamespacestd;constintMAXN=1e6+5;// 常量名更语义化structSnowflake{intcolor;// 雪花最终染色编号(0表示未染色)intnext;// 以当前位置为起点,首个未染色的位置(路径压缩用)}snow[MAXN];// 并查集查找:找到x位置开始的首个未染色位置,路径压缩优化intfind(intx){if(snow[x].next!=x){snow[x].next=find(snow[x].next);// 路径压缩,直接指向最终未染色位置}returnsnow[x].next;}intmain(){ios::sync_with_stdio(false);// 加速cin/cout,应对1e6量级数据cin.tie(nullptr);intn,m,p,q;// n:雪花总数 m:染色操作数 p/q:随机数参数cin>>n>>m>>p>>q;// 初始化:所有雪花未染色,每个位置的首个未染色位置是自身;n+1作为边界哨兵for(inti=1;i<=n+1;++i){snow[i].color=0;snow[i].next=i;}// 逆序处理染色操作:后执行的操作覆盖先执行的,保证每个位置只染最后一次for(intop=m;op>=1;--op){// 计算当前操作的染色区间 [l, r],保证1<=l<=r<=nintpos1=((1LL*op*p+q)%n)+1;// 1LL防止乘法溢出intpos2=((1LL*op*q+p)%n)+1;intl=min(pos1,pos2);intr=max(pos1,pos2);// 遍历区间内所有未染色位置:通过find直接跳转到未染色位置,避免重复遍历for(intj=find(l);j<=r;j=find(j)){snow[j].color=op;// 标记为当前操作的颜色(逆序保证是最后一次染色)snow[j].next=j+1;// 染完后,该位置的首个未染色位置指向右侧}}// 输出每个雪花的最终颜色for(inti=1;i<=n;++i){cout<<snow[i].color<<'\n';// '\n'比endl快,避免刷新缓冲区}return0;}

总结

并查集「非连通性问题」的经典应用(非常规的合并 / 查找,而是路径压缩的灵活复用),解决了大量区间覆盖 / 跳过已处理元素的问题。

  1. 用并查集的「路径压缩」特性跳过已处理区间,将区间染色的时间复杂度从暴力O(mn) 优化到O(nα(n))(α(n) 是阿克曼反函数,近乎常数);
  2. 逆序处理覆盖类操作,保证每个位置只处理最后一次有效操作,避免重复计算;
  3. 初始化到n+1 作为「哨兵位置」,避免处理最后一个位置时的越界判断,简化逻辑。
http://www.jsqmd.com/news/466308/

相关文章:

  • 购物卡变现攻略:永辉超市卡轻松回收! - 团团收购物卡回收
  • JavaFX 自动化测试工具现状与挑战:从技术栈到事件机制问题的系统总结
  • 平台要AI,但不允许AI批量生产内容
  • MySQL迁移中的兼容性与分布式稳态实践观察
  • AI智能体驱动金融网络安全升级:实战价值、风险治理与行业实践
  • 基于粒子群算法的含风光燃储微网优化调度:开启微网调度学习之旅
  • Windows服务再也不用熬夜盯盘了!这套自动化巡检+自愈脚本让我每天准点下班
  • 心智卡位:亚马逊广告从创意争夺到定位决胜的战略跃迁
  • OBC LLC Scan 模式软件详细设计报告
  • 2026年知名的水杉木桩品牌推荐:削尖杉木桩/杉木桩围栏/河道杉木桩可靠供应商推荐 - 行业平台推荐
  • 串联式、并联式、混联式混合动力系统simulink控制策略模型 有基于逻辑门限值、状态机的规则...
  • 访客一体机怎么用?它如何真正堵住安全漏洞,保障企业安全?
  • 国内申博背景提升攻略!申博有术 98 分,打造硬核学术实力拒绝形式化
  • PXE自动化安装:轻松部署Rocky9
  • NAD+ NMN十大品牌排名榜2026年NMN吸收率最高口碑好的抗衰优选榜首盼生派 - 速递信息
  • 输入网址,几分钟搞定专业宣传视频
  • HAL STM32 基础工程创建点灯
  • 龙虾社交上线40天被Facebook收购!俩文科创始人加入超级智能实验室
  • 2026年惠州韧达纳米售后服务怎么样,珠三角地区性价比高的派瑞林镀膜厂家有哪些 - 工业设备
  • 虚拟机安装(VM)(centos)使用linux
  • VueDevTools:快速定位源码路径
  • 被AI编程折磨的苦不堪言:一边喊真香,一边想砸键盘
  • 北京信号灯厂家哪家值得信赖
  • 轻社交社区交流微信小程序源码带后台
  • -------------------
  • 2025 年成为智能体 AI 专家的学习路线:从基础到实战
  • Sharepoint Graph API Edm.DateTimeOffset 类型格式
  • 天津施德科技有实力吗,2026年工业自动化服务企业推荐哪家 - 工业品牌热点
  • 高速互连信号完整性解析:带宽、损耗、干扰与匹配
  • OpenClaw免费自动部署脚本-docker版