题意

有 \(n\) 个点,\(m\) 条边,每条边连接 \(u \Leftrightarrow v\) 且权值为 \((a, b)\) 。

共有 \(q\) 次询问,每次询问给出 \(u, v, q_a, q_b\) 。

问是否存在一个联通块 \(S\) ,使得其中包含 \(u, v\) 且 \(S\) 中的边 \(e\) 满足 \(\max_{e \in S} a_e = q_a, \max_{e \in S} b_e = q_b\) 。

\(n, q \le 5 \times 10^4, m \le 10^5\)

题解

对于这种有两维 \(a, b\) 最大值确定的题,常常可以用分块来解决问题。

具体来说就是先把 \(a\) 从小到大排序,然后分块。

我们把每个询问挂在 \(q_a\) 被第 \(i\) 个块所有的边的 \(a_e\) 构成的区间包含的块中(如果有多个挂在最后一个)。

然后考虑把 \(i\) 之前的所有的边以及当前区间挂的询问按 \(b\) 从小到大排序即可。

然后从前往后一次处理每个操作,如果有边就加入并查集中(并查集维护连通性,以及每个联通块 \(S\) 边权 \(a,b\) 的最大值)。

如果是询问的话,暴力将当前块内合法的边(也就是两维都不超过当前询问)加入即可,然后最后记得需要把所有加入的边撤回。

这个利用可撤销并查集就行了。(按秩(深度)合并,用栈维护维护之前的状态就行了)

似乎把块调成 \(\sqrt {n \log n}\) ,可以做到 \(O(n \sqrt {n \log n})\) 的复杂度。(此处假设 \(n, m\) 同级)复杂度当然是瞎分析的啦qwq

总结

对于求两位偏序需要满足条件的题,常常可以分块然后配合可撤销数据结构来解决。

然后可以调整块大小优化复杂度?

代码

#include <bits/stdc++.h>#define For(i, l, r) for(register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for(register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl
#define DEBUG(...) fprintf(stderr, __VA_ARGS__)using namespace std;template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; }inline int read() {int x(0), sgn(1); char ch(getchar());for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);return x * sgn;
}void File() {
#ifdef zjp_shadowfreopen ("P3247.in", "r", stdin);freopen ("P3247.out", "w", stdout);
#endif
}const int N = 1e5 + 1e3;struct Option {int u, v, a, b, k;inline void Get(int k_ = 0) {u = read(); v = read();a = read(); b = read(); k = k_;}} E[N], Q[N];struct Cmpa {inline bool operator () (const Option &lhs,const Option &rhs) const {return lhs.a != rhs.a ? lhs.a < rhs.a : lhs.b < rhs.b;}
};struct Cmpb {inline bool operator () (const Option &lhs,const Option &rhs) const {return lhs.b != rhs.b ? lhs.b < rhs.b : lhs.a < rhs.a;}
};int n, m, blk, ans[N];namespace Union_Set {Option stk[N]; int top;int fa[N], height[N], maxa[N], maxb[N];int find(int x) { return fa[x] == x ? x : find(fa[x]); }Option Merge(int u, int v, int a, int b) {u = find(u); v = find(v);if (height[u] > height[v]) swap(u, v);Option tmp = (Option) {u, v, maxa[v], maxb[v], height[v]};if (height[u] == height[v]) ++ height[v]; fa[u] = v;chkmax(maxa[v], max(a, maxa[u]));chkmax(maxb[v], max(b, maxb[u])); return tmp;}void Retract() {Option cur = stk[top --];fa[cur.u] = cur.u; maxa[cur.v] = cur.a; maxb[cur.v] = cur.b; height[cur.v] = cur.k;}}Option ask[N]; int len;int id[N], Mina[N], Maxa[N], bel[N], Beg[N], End[N];int main () {File();n = read(); m = read(); blk = (int)(sqrt(n * log2(m))) * 0.6;For (i, 1, m) E[i].Get(); sort(E + 1, E + m + 1, Cmpa());For (i, 1, m) {id[i] = i / blk + 1;if (id[i] != id[i - 1]) {Mina[id[i]] = Maxa[id[i]] = E[i].a;Beg[id[i]] = i; End[id[i - 1]] = i - 1;}else chkmin(Mina[id[i]], E[i].a), chkmax(Maxa[id[i]], E[i].a);}End[id[m]] = m;int q = read();For (i, 1, q) {Q[i].Get(i);Fordown (j, id[m], 1)if (Mina[j] <= Q[i].a && Q[i].a <= Maxa[j]) { bel[i] = j; break; }}using namespace Union_Set; For (i, 1, m) if (id[i] != id[i - 1]) {len = 0; For (j, 1, q) if (bel[j] == id[i]) ask[++ len] = Q[j]; if (!len) continue ;sort(E + 1, E + i, Cmpb());sort(ask + 1, ask + len + 1, Cmpb());For (j, 1, n) fa[j] = j, maxa[j] = maxb[j] = -1;int pa = 1, pb = 1;while (pa < i || pb <= len) {if ((pa < i && E[pa].b <= ask[pb].b) || pb > len) {Merge(E[pa].u, E[pa].v, E[pa].a, E[pa].b); ++ pa;} else {For (j, Beg[id[i]], End[id[i]])if (E[j].a <= ask[pb].a && E[j].b <= ask[pb].b)stk[++ top] = Merge(E[j].u, E[j].v, E[j].a, E[j].b);int rt = find(ask[pb].u);if (rt == find(ask[pb].v)) ans[ask[pb].k] = maxa[rt] == ask[pb].a && maxb[rt] == ask[pb].b;while (top) Retract(); ++ pb;}}}For (i, 1, q) puts(ans[i] ? "Yes" : "No");return 0;}

转载于:https://www.cnblogs.com/zjp-shadow/p/10054255.html

LOJ #2048. 「HNOI2016」最小公倍数相关推荐

  1. Loj #3111. 「SDOI2019」染色

    Loj #3111. 「SDOI2019」染色 题目描述 给定 \(2 \times n\) 的格点图.其中一些结点有着已知的颜色,其余的结点还没有被染色.一个合法的染色方案不允许相邻结点有相同的染色 ...

  2. Loj #3055. 「HNOI2019」JOJO

    Loj #3055. 「HNOI2019」JOJO JOJO 的奇幻冒险是一部非常火的漫画.漫画中的男主角经常喜欢连续喊很多的「欧拉」或者「木大」. 为了防止字太多挡住漫画内容,现在打算在新的漫画中用 ...

  3. LOJ#2230. 「BJOI2014」大融合

    LOJ#2230. 「BJOI2014」大融合 题目描述 小强要在$N$个孤立的星球上建立起一套通信系统.这套通信系统就是连接$N$个点的一个树.这个树的边是一条一条添加上去的. 在某个时刻,一条边的 ...

  4. loj#2143. 「SHOI2017」组合数问题

    loj#2143. 「SHOI2017」组合数问题 题目描述 Solution 考虑转化一下我们要求的东西. ∑i=0n(nkik+r)=∑i=0n(nki)[i≡r(modk)]\sum_{i=0} ...

  5. LOJ#2542. 「PKUWC2018」随机游走

    LOJ#2542. 「PKUWC2018」随机游走 题目描述 Solution 去过一个点集中所有节点的期望时间不好求,考虑min−maxmin-maxmin−max容斥,转化为求第一次到达某一个点集 ...

  6. LOJ#2145. 「SHOI2017」分手是祝愿

    LOJ#2145. 「SHOI2017」分手是祝愿 题目描述 Solution 首先有一个结论: 灯的状态序列a1,a2...ana_1,a_2...a_na1​,a2​...an​唯一对应了一个最优 ...

  7. Loj #2568. 「APIO2016」烟花表演

    Loj #2568. 「APIO2016」烟花表演 题目描述 烟花表演是最引人注目的节日活动之一.在表演中,所有的烟花必须同时爆炸.为了确保安全,烟花被安置在远离开关的位置上,通过一些导火索与开关相连 ...

  8. Loj #2585. 「APIO2018」新家

    Loj #2585. 「APIO2018」新家 题目描述 五福街是一条笔直的道路,这条道路可以看成一个数轴,街上每个建筑物的坐标都可以用一个整数来表示.小明是一位时光旅行者,他知道在这条街上,在过去现 ...

  9. Loj #2983. 「WC2019」数树

    Loj #2983. 「WC2019」数树 题目背景 白兔喜欢树. 白云喜欢数数. 有 \(n\) 只鼠,白兔用 \(n − 1\) 根蓝色绳子把它们连成了一棵树,每根蓝色绳子连着两只鼠,白云用 \( ...

最新文章

  1. Service Fabric独立集群搭建
  2. [Node.js]回调函数
  3. Java相对路径读取文件
  4. redis的安装过程基本配置及遇到问题的解决
  5. RN学习笔记01:概述、特点与环境搭建
  6. 判断字符串最后两个字符
  7. SQL SERCER 控制 SERVERICE BROKER 服务
  8. ubuntu16.04 创建配置并使用虚拟环境
  9. Web开发牛人访谈:你们都在用什么?
  10. 控制策略 | PI控制器抗饱和积分的仿真分析
  11. 金融壹账通第一季营收10亿 沈崇锋:推进双重主要上市
  12. java中innerhtml_js中innerHTML与innerText的用法与区别 | 学步园
  13. 28 爬虫 - re 正则 匹配中文
  14. win7 docker的受难记——exit status 255的终极解决
  15. 2019长沙理工大学计算机专业分数线,2019长沙理工大学各省各批次录取分数线汇总...
  16. 音乐ToB赛道的隐形巨头
  17. Matlab编程技巧:通过脚本导入Excel数据字典
  18. 【19调剂】国家211工程大学、世界一流学科建设高校-福州大学,硕士研究生预调剂通知...
  19. 从重视研发到建立高效的研发管理体系
  20. Erp 公司系列:QAD

热门文章

  1. 【科创人独家】SegmentFault高阳:创业这事不作死也会死,“人和”是第一要素
  2. QT多线程接收串口数据
  3. html 弹窗之后页面变灰色,html点击按钮弹出窗口背景灰掉,点击背景变白退出点击退出也可以...
  4. Linux服务器配置tomcat环境变量
  5. python 知乎接口_用Python寻找知乎最美小姐姐
  6. 索尼koov机器人比赛_索尼KOOV机器人诞生2周年纪念日新起点一起再出发
  7. MS Word2010快捷键汇总
  8. 兼容性强,科技感十足,Yottamaster双协议M.2固态硬盘盒上手
  9. android代码调用相机,Android如何调用系统相机拍照
  10. 李开复给中国大学生的第五封信——你有选择的权利