[BZOJ4320]ShangHai2006 Homework Description   1:在人物集合 S 中加入一个新的程序员,其代号为 X,保证 X 在当前集合中不存在.    2:在当前的人物集合中询问程序员的mod Y 最小的值. (为什么统计这个?因为拯救过世界的人太多了,只能取模)  Input 第一行为用空格隔开的一个个正整数 N.  接下来有 N 行,若该行第一个字符为“A” ,则表示操作 1:若为“B”,表示操作 2:  其中 对于 100%的数据:N≤100000, 1≤…
正解:分块+并查集 解题报告: 传送门! 真的好神仙昂QAQ,,,完全想不出来,,,还是太菜了QAQ 首先还是要说下,这题可以用K-D Tree乱搞过去(数据结构是个好东西昂,,,要多学学QAQ),但是我不会,暂时也不打算学更不打算写这种方法,所以只是提一下可以用这个姿势过去QAQ 然后说下另外一个方法,神仙一般的(分块+并查集),,, 首先要get一个套路,是这样儿的: 对于这种有两种限制的题目 一般的套路就是条件按照第一种权值为关键字排序,询问按照第二种关键字排序 然后对于条件先按第一关键字…
[APIO2019] [LOJ 3145] 桥梁(分块+并查集)(有详细注释) 题面 略 分析 考试的时候就感觉子任务4是突破口,结果却写了个Kruskal重构树,然后一直想怎么在线用数据结构维护 实际上是离线算法.考虑只有查询的时候.我们可以离线对查询的权值从大到小排序,边也按边权从大到小排序,然后对于权值比询问大的边,把边两端结点集合合并.答案就是查询点所在点集的大小.只需要用并查集维护,然后双指针扫描,由于一条边只会被加进去一次,时间复杂度为$ O(n\log n)$ 考虑有修改的情况.所…
分块+并查集,大板子,没了. 并查集不路径压缩,可撤销,然后暴力删除 这样对于每个块都是独立的,所以直接搞就行了. 然后块内修改操作搞掉,就是单独的了 // powered by c++11 // by Isaunoya #include <bits/stdc++.h> #define rep(i, x, y) for (register int i = (x); i <= (y); ++i) #define Rep(i, x, y) for (register int i = (x);…
考虑根号分块.对于<√3e5的模数,每加入一个数就暴力更新最小值:对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过.考虑并查集在序列上的奇技淫巧.加点不太能做,考虑离线改成删点.并查集维护下一个未删除的点即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<…
对于<=sqrt(300000)的询问,对每个模数直接记录结果,每次加入新数时暴力更新每个模数的结果. 对于>sqrt(300000)的询问,枚举倍数,每次查询大于等于这个倍数的最小数是多少,这个操作通过将询问逆序使用并查集支持. #include<cstdio> #include<algorithm> #define rep(i,l,r) for (int i=(l); i<=(r); i++) using namespace std; ,M=,B=; char…
4537: [Hnoi2016]最小公倍数 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1687  Solved: 607[Submit][Status][Discuss] Description 给定一张N个顶点M条边的无向图(顶点编号为1,2,…,n),每条边上带有权值.所有权值都可以分解成2^a*3^b 的形式.现在有q个询问,每次询问给定四个参数u.v.a和b,请你求出是否存在一条顶点u到v之间的路径,使得 路径依次经过的边上的权值的最…
题目链接  2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块.    分块的时候满足每个块是一个连通块,那么每个块就有一个共同的祖先. 把询问按照第一个点被第一棵树的哪个祖先管辖和第二个点被第二棵树的哪个祖先管辖,分成$n$类. 每一类询问一起处理,处理完后用可撤销并查集恢复到之前的状态. 每一类询问之间依次转移,每次转移,移动次数不会超过$\sqrt{n}$次. 最后总时间复杂度$O(n^{…
题目大意: 给定一张n个点m条边的无向图,每条边有两种权.每次询问某两个点之间是否存在一条路径上的边的两种权的最大值分别等于给定值. n,q <= 50000. m <= 100000 题解: 通过分析可以得到,我们能经过的所有的边的两种权一定均分别不大于给定的值. 把这些边称作可行边.那么我们把所有的可行边加入到图当中,然后判断询问的两个点是不是联通. 如果联通我们再进一步判断一下所有与其所在的联通块联通的所有边的两种边权的分别的最大值. 然后就是考虑如何快速统计出所有的边并将其加入到联通块…
题目链接  Mr. Kitayuta's Colorful Graph 把每种颜色分开来考虑. 所有的颜色分为两种:涉及的点的个数 $> \sqrt{n}$    涉及的点的个数 $<= \sqrt{n}$ 对于第一种颜色,并查集缩点之后对每个询问依次处理过来若两点连通则答案加一. 对于第二种颜色,并查集缩点之后对该颜色涉及的所有点两两之间判断是否连通, 若连通则另外开一个$map$记录答案. 最后把两个部分的答案加起来即可. 细节问题  由于每种颜色处理完之后并查集都要重新初始化,对于第一种…