题意及思路:https://blog.csdn.net/u013534123/article/details/89010251

之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接并查集搞一搞就行了。对于这个题,因为有删除操作,我们对操作序列建一颗线段树,记录每个操作影响的区间操作就可以了。这里的并查集不能路径压缩,要按秩合并,这样复杂度是O(logn)的。

代码:

#include <bits/stdc++.h>
#define ls (o << 1)
#define rs (o << 1 | 1)
#define INF 0x3f3f3f3f
#define db double
#define pii pair<int, int>
#define LL long long
using namespace std;
const int maxn = 300010;
const int Base = 300000;
vector<pii> tr[maxn * 4];
map<pii, int> mp;
map<pii, int>::iterator it;
LL res[maxn], cnt_x[maxn * 2], cnt_y[maxn * 2], sz[maxn * 2];
int f[maxn * 2];
LL ans;
pii a[maxn];
int get(int x) {if(x == f[x]) return x;return get(f[x]);
}
void add(int o, int l, int r, int ql, int qr, pii val) {if(l >= ql &&r <= qr) {tr[o].push_back(val);return;}int mid = (l + r) >> 1;if(ql <= mid) add(ls, l, mid, ql, qr, val);if(qr > mid) add(rs, mid + 1, r, ql, qr, val);
}
void del(int x, int y) {int x1 = get(x), y1 = get(y);if(x1 != y1) return;ans -= cnt_x[x] * cnt_y[x];cnt_x[x] -= cnt_x[y], cnt_y[x] -= cnt_y[y];sz[x] -= sz[y];ans += cnt_x[x] * cnt_y[x];ans += cnt_x[y] * cnt_y[y];f[y] = y;
}
pii merge(int x, int y) {int x1 = get(x), y1 = get(y);if(x1 == y1) return make_pair(-1, -1);if(sz[x1] < sz[y1]) swap(x1, y1);ans -= cnt_x[x1] * cnt_y[x1];ans -= cnt_x[y1] * cnt_y[y1];sz[x1] += sz[y1];cnt_x[x1] += cnt_x[y1], cnt_y[x1] += cnt_y[y1];ans += cnt_x[x1] * cnt_y[x1];f[y1] = x1;return make_pair(x1, y1);
}
void dfs(int o, int l, int r) {if(l == 12) {l++;l--;}stack<pii> s;for (auto x : tr[o]) {pii tmp = merge(x.first, x.second);if(tmp.first != -1) s.push(tmp);}if(l == r) res[l] = ans;else {int mid = (l + r) >> 1;dfs(ls, l, mid);dfs(rs, mid + 1, r);}while(!s.empty()) {del(s.top().first, s.top().second);s.pop();}
}
int main() {int n, x, y;scanf("%d", &n);for (int i = 1; i <= n; i++) {scanf("%d%d", &x, &y);y += Base;a[i] = make_pair(x, y);if(mp.find(a[i]) == mp.end()) mp[a[i]] = i;else {add(1, 1, n, mp[a[i]], i - 1, a[i]);mp.erase(a[i]);}}for (it = mp.begin(); it != mp.end(); it++) {add(1, 1, n, it -> second, n, it -> first);}for (int i = 1; i <= Base; i++) {f[i] = i, cnt_x[i] = 1, cnt_y[i] = 0, sz[i] = 1;}for (int i = Base + 1; i <= Base * 2; i++) {f[i] = i, cnt_x[i] = 0, cnt_y[i] = 1, sz[i] = 1;}dfs(1, 1, n);for (int i = 1; i <= n; i++)printf("%lld ", res[i]);
}

  

转载于:https://www.cnblogs.com/pkgunboat/p/11027129.html

Codeforces 1140F 线段树 分治 并查集相关推荐

  1. CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

    题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...

  2. 牛客多校8 - All-Star Game(线段树分治+并查集按秩合并的撤销操作)

    题目链接:点击查看 题目大意:有 n 个球员和 m 个球迷,一个球员可能是多个球迷的粉丝,需要选择最少的球员进行比赛,使得所有的球迷都愿意观看(对于每个球迷来说,都有至少一个其喜欢的球员入选比赛) 对 ...

  3. 越野赛车问题——线段树分治+并查集

    题目 [题目描述] 小 $H$ 是一位优秀的越野赛车女选手.现在她准备在 $A$ 山上进行赛车训练. $A$ 山上一共有 $n$ 个广场,编号依次为 $1$ 到 $n$ ,这些广场之间通过 $n-1$ ...

  4. BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)

    传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...

  5. bzoj4025-二分图【线段树分治,并查集】

    正题 题目链接:https://darkbzoj.tk/problem/4025 题目大意 nnn个点mmm条边,每条边会在一个TTT以内的时间段内出现,对于任意一个TTT以内的时刻求图是否是一个二分 ...

  6. BZOJ4399魔法少女LJJ——线段树合并+并查集

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉 ...

  7. Codeforces.1051G.Distinctification(线段树合并 并查集)

    题目链接 \(Description\) 给定\(n\)个数对\(A_i,B_i\).你可以进行任意次以下两种操作: 选择一个位置\(i\),令\(A_i=A_i+1\),花费\(B_i\).必须存在 ...

  8. c++自带的可持久化平衡树?rope大法好!(超详细解答 + 5道例题讲解,可直接替代可持久化的线段树、并查集、平衡树!)

    整理的算法模板合集: ACM模板 目录 c++自带的可持久化平衡树?rope大法好! 1. 声明 2. 支持操作 char类型的rope int类型的rope 3. 具体的细节 4. "可持 ...

  9. [NOI2018] 归程(线段树维护并查集的可持久化/kruskal重构树,倍增+dijkstra最短路)

    [NOI2018] 归程 description solution1 code1 solution2 code description 题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要 ...

最新文章

  1. idea2019配置gradle详解_Java学习之——Gradle的安装配置、IDEA中创建Gradle的Java项目...
  2. mysql行级视图与列级视图_[数据库]--DML、DDL、TCL语言
  3. ssh服务、密钥登陆配置
  4. 谷歌guava_Google Guava BiMaps
  5. Java 8 Lambda演练
  6. 编写的windows程序,崩溃时产生crash dump文件的办法
  7. Sublime Text3 多行合并为一行
  8. 四川加油,中国人加油!我们永远不服输!
  9. java拼图游戏Mian_Java拼图游戏源码 MainApp启动器 main(): 创建主界面类对 联合开发网 - pudn.com...
  10. matlab 普通数值计算,数值计算方法(MATLAB版)
  11. 量化投资学习——股指期货研究(三)
  12. 2019未来科学大奖周盛大开幕 百格活动倾情助力
  13. 美团一面:说说前、后端分离权限控制设计和实现思路?
  14. [转载]js技巧收集(200多个)
  15. 案例解析|自然保护区水资源远程监控方案
  16. js 获取字符串长度方法length
  17. 智能家居控制模拟套件
  18. 使用服务器训练模型详解
  19. 进行股票量化交易接口程序化开发要注意的事项
  20. 三维立体坐标系 html5,几何画板绘制三维坐标系的操作方法

热门文章

  1. 自定义按键_NS推送10.0.0版本更新 新增按键自定义和数据转移功能
  2. 鸿蒙OS扫描二维码,京东鸿蒙OS 2.0,京东鸿蒙OS 2.0手机app官方版预约 v1.0-手游汇
  3. springboot启动图标_SpringBoot基础教程
  4. 为什么在python中整数的值没有限制_为什么在Python中整数是不可变的?
  5. jquery audio没有声音_Python实用案例编程入门:第十四章 通过声音控制您的计算机
  6. User can only log in via localhost
  7. 某公司防火墙配置-2
  8. java设计模式学习 ----- 单例模式(Singleton)
  9. Node.js使用supervisor遭遇‘supervisor’不是内部或外部命令,如果解决?
  10. 打造高效前端工作环境 - tmux