![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
启发式合并
二分抄代码
去了18ec没资格去19ec的反向训练选手
展开
-
AtCoder Beginner Contest 183 F - Confluence
https://atcoder.jp/contests/abc183/tasks/abc183_f裸的启发式合并对每个连通块维护个map表示存在哪些班级的几个人就行了#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxl=3e5+10;int n,m,cnt,tot,cas,ans;int a[maxl],c[maxl],f[maxl],sz[maxl];map&l原创 2020-11-15 21:45:50 · 240 阅读 · 0 评论 -
洛谷P4755 Beautiful Pair 笛卡尔树上启发式合并 主席树计数
https://www.luogu.com.cn/problem/P4755这题思路挺简单的,写起来有一点长对整个序列构建笛卡尔树,每个节点大于他的左子树和右子树的所有值,那么就可以对笛卡尔树进行dfs,回溯时启发式合并两个子树,根节点就是最大值,枚举小的那边每个位置a[i],计算出每一个位置所能够接受的a[j]的上限,然后用主席树去另一个区间求区间内满足1-a[j]上限的个数,就是跨过a[u]并以a[u]为最大值的美丽的数对的数量#include<bits/stdc++.h>u原创 2020-08-08 21:27:06 · 264 阅读 · 0 评论 -
G-Operating on a Graph 2020牛客多校第3场
https://ac.nowcoder.com/acm/contest/5668/G启发式合并,然后记录一下头指针,合并枚举元素的时候顺便连一下边#include<bits/stdc++.h>using namespace std;inline char nc(){ static char buf[100000],*p1=buf,*p2=buf; return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin原创 2020-07-18 17:00:34 · 195 阅读 · 0 评论 -
cf600E
一开始用sb方法,时间没超然而内存爆了,之后又换了操作,启发式合并可证明最坏情况是合并的复杂度一共是nlognlogn的复杂度。map还是好容易在dfs里面炸内存啊。然而他swap两个map和swap两个map的下标最后的时间差别只有一点点。据说swap(map[1],map[2])是只交换指针的,不用遍历整个map[1],map[2]种的元素,神奇。#include<cstdi...原创 2017-11-15 20:04:56 · 555 阅读 · 0 评论 -
Codeforces 1009 F
这道题我是真的服了。好不容易想起来启发式合并,然后顺着思路想到了一个清奇的解法,对于每个点开一个map,m[u](dep[u],num)存的是u的子树中,深度为dep[u]的点的个数,这样对于每个点的合并,先直接找到包含最长链的那个子节点v,m[u]=m[v],因为最长链就代表了又更多的dep值,而且这个是一个指针操作,复杂度是O(1)的,(没有证实,以前好像挺学长讲过这个),map里存的东西...原创 2018-07-16 21:27:52 · 440 阅读 · 0 评论 -
HDU6430 Problem E. TeaTree
每个点开个set记录一蛤当前连通块中有哪些因数了,树上dfs下去启发式合并一蛤,一个点的答案必定是两个不同子树中的共同因数,取个大的就行了,3900+ms飘过了233,今天才知道set的clear是可以清空内存的,一开始MLE了,然后vector 清空内存直接swap(e[i],vector<int>())就能内存回收。这题好像有另一种形式,一个序列和另外一个序列任选两个数,然后求最大...原创 2018-08-23 16:28:23 · 429 阅读 · 0 评论