由于晚上比赛二连(Atcoder&codeforces),外加复习学考,所以暂时没时间写了. 贴个O(n√n)的分块代码,洛谷和cf上都过了,但垃圾bzoj卡不过去,不改了. #include<bits/stdc++.h> using namespace std; ; ][N],tag[N]; int find(int x){return x==fa[x]?x:fa[x]=find(fa[x]);} void build(int id) { ; ; for(int i=l[id];i&…
正解:分块+并查集 解题报告: 传送门! 真的好神仙昂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);…
洛谷 Codeforces 又是一道卡常题-- 思路 YNOI当然要分块啦. 分块之后怎么办? 零散块暴力,整块怎么办? 显然不能暴力改/查询所有的.考虑把相同值的用并查集连在一起,这样修改时就只需要枚举值了. 然而每次修改的\(x\)特别小时仍然复杂度爆炸,发现大于\(x\)的减去\(x\)等价于小于等于\(x\)的加上\(x\),然后整体减去\(x\). 那么,设一个块的最大值为\(mx\),则 \(2x\geq mx\)时枚举\(x<v\leq mx\),把\(v\)的并查集连到\(v-x…
题目描述 二阶堂真红给了你一个长为n的序列a,有m次操作 1.把区间[l,r]中大于x的数减去x 2.查询区间[l,r]中x的出现次数 题解 做YNOI真**爽... 我们发现这道题的操作非常诡异,把大于x的数减去x. 想一想这个操作会带来什么,会使这个数列的极差减小x(如果有大于x的数的话). 然后如果我们能以至多O(x)的代价是极差缩小x的话,那么它的总复杂度是不会超过O(n)的. 然后我们发现log数据结构没法维护这种东西. 于是就用到了分块,每个块中维护每种数字出现的最早位置,然后把相同…
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之间的路径,使得 路径依次经过的边上的权值的最…
考虑根号分块.对于<√3e5的模数,每加入一个数就暴力更新最小值:对于>√3e5的模数,由于最多被分成√3e5块,查询时对每一块找最小值,这用一些正常的DS显然可以做到log,但不太跑得过.考虑并查集在序列上的奇技淫巧.加点不太能做,考虑离线改成删点.并查集维护下一个未删除的点即可. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> #include<…
题目链接  2017 CCPC Hangzhou Problem H 思路:对树进行分块.把第一棵树分成$\sqrt{n}$块,第二棵树也分成$\sqrt{n}$块.    分块的时候满足每个块是一个连通块,那么每个块就有一个共同的祖先. 把询问按照第一个点被第一棵树的哪个祖先管辖和第二个点被第二棵树的哪个祖先管辖,分成$n$类. 每一类询问一起处理,处理完后用可撤销并查集恢复到之前的状态. 每一类询问之间依次转移,每次转移,移动次数不会超过$\sqrt{n}$次. 最后总时间复杂度$O(n^{…
题目大意: 给定一张n个点m条边的无向图,每条边有两种权.每次询问某两个点之间是否存在一条路径上的边的两种权的最大值分别等于给定值. n,q <= 50000. m <= 100000 题解: 通过分析可以得到,我们能经过的所有的边的两种权一定均分别不大于给定的值. 把这些边称作可行边.那么我们把所有的可行边加入到图当中,然后判断询问的两个点是不是联通. 如果联通我们再进一步判断一下所有与其所在的联通块联通的所有边的两种边权的分别的最大值. 然后就是考虑如何快速统计出所有的边并将其加入到联通块…