[COCI2017-2018#5] Pictionary(并查集+dfs)

贼ex的一道,卡了本仙女整整7个小时orz
在这里插入图片描述
思路容易理解,but码力very重要orz
我愿意花五毛钱提升我的码力,换个脑子也行,不换脸这张脸生得俊俏
luogu传送door

题目

在宇宙一个不为人知的地方,有一个星球,上面有一个国家,只有数学家居住。 在这个国家有n个数学家,有趣的是,每个数学家都住在自己的城市,且城市间无道路相连,因为他们可以在线交流。当然,城市有从1到n的编号。

一位数学家决定用手机发论文,而手机将“不言而喻”自动更正成了“猜谜游戏”。 不久之后,这个国家就发现了猜谜游戏。他们想要见面一起玩,于是这个国家就开始了修路工程。 道路修建会持续m天。对于第i天,若gcd(a,b)=m−i+1,则a和b城市间会修一条路。

由于数学家们忙于建筑工作,请你来确定一对数学家最早什么时候能凑到一起玩。

输入输出格式
输入格式
第一行有三个正整数n,m,q,表示城市数量、修路持续天数、询问数量。 接下来q行,每行有两个正整数a,b,表示询问a和b两个城市的数学家最早什么时候能在一起玩。

输出格式
输出q行,第i行有一个正整数,表示第i次询问的结果

说明
数据范围:
对于40%的数据:n≤4000,q≤10 ^5

对于全部数据:
1≤n,q≤10^5

1≤m≤n1≤m≤n

样例1解释: 在第一天,(3,6)(3,6)之间修了一条路,因此第二次询问输出1
在第二天,(2,4),(2,6),(2,8),(4,6),(6,8)(2,4),(2,6),(2,8),(4,6),(6,8)之间都修了一条路,此时44和88号城市连通,第三次询问输出2
在第三天,所有编号互质的城市之间都修了路,2和5号城市在此时连通,第一次询问输出1

样例2解释: 在第二天,(20,15)之间修了一条路
第四天,(15,9)之间修了一条路
所以20和9号城市在第四天连通,输出4

题解

我看了luogu题解,发现根本没有人跟宝宝是一个做法,当时,我的妈呀!
俺内心慌得一批,但是我在这条不归路上继续走了下去,误入歧途啊
七个小时终于把这个江山打下来了在这里插入图片描述
肯定很好想,问这两个城市有没有相通,肯定是我们的并查集大哥,这个不用多说!
而且1与任何数都互质,那么在最后一天施完工后肯定所有城市都是互通的,
这就是一棵赤裸裸的树

我们真正要解决的就是这两个城市在第几天成为了一个集合

帅气的我的实现是先预处理每一天,哪些城市会进行施工相通,边处理,边并查集,这样的话就不用把所有的边全部得到后再sort再并查集。
因为从m到1循环的话,i,j之间没路时,这天就是最早的 ,

PS:并查集的unionSet一定要用优化的启发式,不然就等着TLE回家找妈妈吧!
反正我是把长城都哭淹了!我们在进行unionSet时顺便建个有向边,
一定是爸爸之间建边,又哭了orz

接着就是dfs,不一定是从1开始,可以用循环找根节点f[i]==i,哭了哭了。
dfs处理每一个点的深度,而且可以保证每个点的入度不会大于1,在处理深度的同时,把u,v两点第几天相同的也记录下来,用vector可以办到

最后就是爬树,妙啊!妙啊!暴力lca都行的老铁,
因为每个点都只有一个爸爸 (诶)
所以这棵树也是唯一的,路径唯一的,
我们就在线操作,x,y用一个Max记录x和y在往上爬的时候路径的最大值

以上听起来是不是很简单啊woo~

代码实现

瞅瞅吧!七个小时的改了n遍,长得惨不忍睹啊!这浓缩的都是精华啊!
还有rank标记数组,rank是关键字,又哭了哭了orz,泪腺炸了

#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define MAXN 100005
#define LL long long
struct node {int v, w;node () {}node ( int A, int B ) {v = A;w = B;}
}depth[MAXN];
int n, m, q, cnt;
int f[MAXN];
int ran[MAXN];
vector < node > tree[MAXN];
void makeSet () {for ( int i = 1;i <= n;i ++ )f[i] = i;
}
int findSet ( int x ) {while ( x != f[x] ) x = f[x];return x;
}
void unionSet ( int x, int y, int w ) {int u = findSet( x ); int v = findSet( y );if ( u == v ) return;if ( ran[u] > ran[v] ) {f[v] = u;tree[u].push_back ( node ( v, w ) );}else {f[u] = v;if( ran[u] == ran[v] )ran[v] ++;tree[v].push_back ( node ( u, w ) );}
}
void dfs ( int x, int dep, int val ) {if ( depth[x].v ) return;depth[x].v = dep;depth[x].w = val;for ( int i = 0;i < tree[x].size();i ++ ) {int v = tree[x][i].v, w = tree[x][i].w;dfs ( v, dep + 1, w );}
}
int Max = 0;
void lca ( int x, int y ) {while ( depth[x].v > depth[y].v ) {Max = max ( depth[x].w, Max );x = f[x];}while ( depth[y].v > depth[x].v ) {Max = max ( depth[y].w, Max );y = f[y];}while ( x != y ) {Max = max ( depth[x].w, Max );Max = max ( depth[y].w, Max );x = f[x];y = f[y];}
}
int main() {scanf ( "%d %d %d", &n, &m, &q );makeSet ();for ( int i = m;i >= 1;i -- )for ( int j = i * 2;j <= n;j += i )if ( findSet ( j - i ) != findSet ( j ) )unionSet ( j - i, j, m - i + 1 );for ( int i = 1;i <= n;i ++ )if ( f[i] == i ) {dfs ( i, 1, 0 );break;}for ( int i = 1;i <= q;i ++ ) {int a, b;scanf ( "%d %d", &a, &b );Max = 0; lca ( a, b );printf ( "%d\n", Max );	}return 0;
}

把这道题A(≧▽≦)/啦啦啦
在这里插入图片描述在这里插入图片描述
好了,像打了鸡血吃兴奋剂一样,有任何代码,思路不懂得欢迎留言,欢迎欢迎热烈欢迎,我们不卖假,诚信营业,做出世界前五百强!byebye~不要太想帅气又多金的我!

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

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

相关文章

P4570 [BJWC2011]元素

题目描述&#xff1a; 每个矿石有序号和魔力值&#xff0c;每个矿石最多使用一次&#xff0c;且多个矿石序号不能异或为0的前提下&#xff0c;问最多可以得到多少魔力值 题解&#xff1a; 异或运算的最终结果只和用于运算的数的各位上1的数量有关&#xff0c;与各数字运算的…

Docker最全教程——从理论到实战(九)

在本系列教程中&#xff0c;笔者希望将必要的知识点围绕理论、流程&#xff08;工作流程&#xff09;、方法、实践来进行讲解&#xff0c;而不是单纯的为讲解知识点而进行讲解。也就是说&#xff0c;笔者希望能够让大家将理论、知识、思想和指导应用到工作的实际场景和实践之中…

【做题记录】CF1444A Division

CF1444A Division 题意&#xff1a; 给定 \(t\) 组询问&#xff0c;每组给两个数 \(p_i\) 和 \(q_i\) &#xff0c;找出最大的整数 \(x_i\) &#xff0c;要求 \(p_i\) 可被 \(x_i\) 整除&#xff0c;且 \(x_i\) 不可被 \(q_i\) 整除 。 题解&#xff1a; 呜呜呜这道题总共算下来…

CF891C-Envy【可撤销并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF891C 题目大意 nnn个点mmm条边的一张无向联通图&#xff0c;每次询问一个边集能否同时出现在同一棵最小生成树上。 1≤n,m,q,wi,∑k≤51051\leq n,m,q,w_i,\sum k\leq 5\times 10^51≤n,m,q,wi​,∑k≤5105 解题思路 考虑K…

[2019CSP多校联赛普及组第五周] 调度CPU (贪心)

来来来&#xff0c;走过路过不要错过题目题解代码实现1代码实现2题目 ⼩Y同学有⼀块超级CPU&#xff0c;它有两个超级核⼼A和B。 A核⼼可以同时处理多项任务&#xff0c;每项任务处理时间为x&#xff0c;B核⼼只能同时处理⼀项任务&#xff0c;每项任务处理时间为y。 这⼀天…

8.12模拟:dp递推

文章目录前言本次最大收获考场复盘T1 lectureT2 n-thlonT3 assignmentT4 recoverset总结前言 245分 100704035 不太满意qwq &#xff08;被KH暴打 &#xff09; 后三道题全是部分分 而且T2和T3关键性质都出来了&#xff0c;距离正解只差临门一脚 但是就差了这一脚 感觉今天T2、…

NumSharp v0.6.1 科学计算库发布,支持标量和隐式转换

NumSharp&#xff08;Numerical .NET&#xff09;可以说是C&#xff03;中的科学计算库。 它是用C&#xff03;编写的&#xff0c;符合.netstandard 2.0库标准。 它的目标是让.NET开发人员使用NumPy的语法编写机器学习代码&#xff0c;从而最大限度地借鉴现有大量在python代码的…

【做题记录】CF1451E2 Bitwise Queries (Hard Version)

CF1451E2 Bitwise Queries (Hard Version) 题意&#xff1a; 有 \(n\) 个数( \(n\le 2^{16}\) &#xff0c;且为 \(2\) 的整数次幂&#xff0c;且每一个数都属于区间 \([0,n-1]\) ) 可以通过询问交互库不超过 \(n1\) 次询问&#xff0c;每次询问编号为 \(i,j\) ( \(1\le i,j \l…

P4301 [CQOI2013] 新Nim游戏

P4301 [CQOI2013] 新Nim游戏 题目&#xff1a; 在传统的Nim游戏基础上加一步&#xff0c;在第一个回合中&#xff0c;第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿&#xff0c;但不可以全部拿走。第二回合也一样&#xff0c;第二个游戏者也有这样一次机会。从第…

51nod1667-概率好题【容斥,组合数学】

正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId1667 题目大意 两个人。 第一个人有k1k_1k1​个集合&#xff0c;第iii个包括了范围[L1i,R1i][L1_i,R1_i][L1i​,R1i​]的整数。 第二个人有k2k_2k2​个集合&#xff0c;第iii个包括了范围[L2i,R2i][L2_i…

[Luogu2279][HNOI2003] 消防局的设立

文章目录题目法一&#xff1a;树上DP思路代码实现法二&#xff1a;贪心 搜索思路代码实现题目 2020年&#xff0c;人类在火星上建立了一个庞大的基地群&#xff0c;总共有n个基地。起初为了节约材料&#xff0c;人类只修建了n-1条道路来连接这些基地&#xff0c;并且每两个基…

8.13模拟:分治二分倍增快速幂

文章目录前言考场复盘T1 roadT2 shopT3 runT4 stairs总结前言 240分 100802040 T3少取了一个模结果全挂掉了&#xff08;好不容易推出来了…&#xff09; T2也因为各种奇怪的错误挂了分 qwq 吸取教训吧 考场 今天先看题 T1第一眼看错了题意觉得水的不行 T3YBT原题且很水 T2T…

dnSpy 强大的.Net反编译软件

一说起.net的反编译软件&#xff0c;大家首先想到的就是Reflector&#xff0c;ILSpy&#xff0c;dotPeek等等。而dnSpy同样是一款优秀的反编译软件&#xff0c;同时它是开源免费的。官方的描述是: dnSpy是一个调试器和.NET组件编辑器。 即使您没有任何可用的源代码&#xff0c;…

图的匹配

定义见&#xff1a;OI-Wiki 图的匹配 。 二分图 解法 \(1\) &#xff1a;网络流(通用) 二分图最大匹配可以转换成最大流(费用流)模型 。 如果使用 \(\operatorname{Dinic}\) 算法求该网络的最大流&#xff0c;复杂度\(O(\sqrt{n}m)\) 。 具体代码见博客文章网络流 。 解法 \(2\…

AT2161-[ARC065D]シャッフル/Shuffling【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2161 题目大意 长度为nnn的0/10/10/1串&#xff0c;mmm个区间&#xff0c;你可以按照顺序任意排列区间中的数字&#xff0c;求最后的可能情况数。 保证给出区间的左端点不降。 1≤n,m≤30001\leq n,m\leq 30001≤n,m≤3000…

【acwing210 异或运算】

【acwing210 异或运算】 题意&#xff1a; 给定你由N个整数构成的整数序列&#xff0c;你可以从中选取一些&#xff08;甚至一个&#xff09;进行异或&#xff08;XOR&#xff09;运算&#xff0c;问所有能得到的不同的结果中第k小的结果是多少。 题解&#xff1a; 把所有数…

小奇探险

文章目录题目题解代码实现题目 小奇去遗迹探险&#xff0c;遗迹里有N个宝箱&#xff0c;有的装满了珠宝&#xff0c;有的装着废品。 小奇有地图&#xff0c;所以它知道每一个宝箱的价值&#xff0c;但是它不喜欢走回头路&#xff0c;所以要按顺序拿这N个宝箱中的若干个。 拿宝…

8.14 模拟:字符串

文章目录前言收获考场复盘T1 wordlistT2 passwordT3 readtreeT4 bracket总结前言 290分 2010070100 又被KH爆碾了qwq T1签到题脑抽写挂了80分… &#xff08;就差这80啊…&#xff09;、 收获 学会了启发式合并 还有一个把字符串所有后缀放进trie树的比较字符串的技巧 考场…

基于Asp.Net Core打造轻量级内部服务治理RPC(二 远程服务设计)

紧接上一篇《基于Asp.Net Core打造轻量级内部服务治理RPC(一)》文章。本文主要讲解基于Asp.Net Core的远程服务设计和实现。在上一篇中讲过,服务提供者提供的服务实际上就是一个Controller&#xff0c;那么是否在该程序中&#xff0c;服务都按照Asp.Net Core 中的Web Api的方式…

[TJOI2008]彩灯

题目&#xff1a; Peter 女朋友的生日快到了&#xff0c;他亲自设计了一组彩灯&#xff0c;想给女朋友一个惊喜。已知一组彩灯是由一排 N个独立的灯泡构成的&#xff0c;并且有 MM 个开关控制它们。从数学的角度看&#xff0c;这一排彩灯的任何一个彩灯只有亮与不亮两个状态&a…