这题有以下几个步骤

1.离线处理出每个点的作用范围

2.根据线段树得出作用范围

3.根据分治把每个范围内的点记录和处理

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 50;
typedef pair<int, int> pii;
#define bug cout << "bug" << endl;
vector<pii> rt[maxn << 2];
void update(int o,int l,int r,int ql,int qr,pii pi){
//cout << "o=" << o <<" l="<<l<<" r="<<r<<" ql="<<ql<<" qr="<<qr<<endl;
if(ql<=l&&qr>=r){
rt[o].push_back(pi);
return;
}
int mid = (l + r)/2;
if(ql<=mid)
update(o << 1, l, mid, ql, qr, pi);
if(qr>mid)
update(o << 1 | 1, mid + 1, r, ql, qr, pi);
} int fa[maxn << 1];
ll sz[maxn << 1], szx[maxn << 1], szy[maxn << 1]; int find(int x){
if(fa[x]==x)
return x;
return find(fa[x]);
}
ll value;
ll ans[maxn]; void ins(int x,int y,stack<pii> &st){
int xx = find(x);
int yy = find(y);
if(xx==yy)
return;
if(sz[xx]<sz[yy])
swap(xx, yy);
st.push({xx, yy});
value -= 1LL*szx[yy] * szy[yy];
value -= 1LL*szx[xx] * szy[xx];
sz[xx] += 1LL*sz[yy];
szx[xx] += 1LL*szx[yy];
szy[xx] += 1LL*szy[yy];
value += 1LL*szx[xx] * szy[xx];
fa[yy] = fa[xx];
}
void del(stack<pii> &st){
while(!st.empty()){
int x = st.top().first;
int y = st.top().second;
st.pop();
value -= 1LL*szx[x] * szy[x];
sz[x] -= 1LL*sz[y];
szx[x] -= 1LL*szx[y];
szy[x] -= 1LL*szy[y];
fa[y] = y;
value += 1LL*szx[x] * szy[x];
value += 1LL*szx[y] * szy[y];
}
}
void dfs(int o,int l,int r){
//cout << "o=" << o << " l=" << l << " r=" << r << endl;
stack<pii> st;
for(auto i:rt[o]){
int x = i.first;
int y = i.second;
ins(x, y, st);
}
if(l==r)
ans[l] = value;
else{
int mid = (l + r) / 2;
dfs(o << 1, l, mid);
dfs(o << 1 | 1, mid + 1, r);
}
del(st);
} map<pii, int> mp; int main(){
int q;
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin >> q;
for (int i = 1; i <= q;i++){
int x, y;
cin >> x >> y;
y += 3e5;
pii pi = make_pair(x, y);
if(mp.find(pi)==mp.end()){
mp[pi] = i;
}
else{
update(1, 1, q, mp[pi], i - 1, pi);
mp.erase(pi);
}
}
for(auto i:mp){
update(1, 1, q, i.second, q, i.first);
}
for (int i = 1; i <= 3e5;i++){
fa[i] = i;
sz[i] = 1;
szx[i] = 1;
}
for (int i = 3e5 + 1; i <= 6e5;i++){
fa[i] = i;
szy[i] = 1;
sz[i] = 1;
}
dfs(1, 1, q);
for (int i = 1; i <= q;i++){
cout << ans[i] << " ";
}
return 0;
}

Codeforces 1140F Extending Set of Points (线段树分治+并查集)的更多相关文章

  1. Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)

    Extending Set of Points 我们能发现, 如果把x轴y轴看成点, 那么答案就是在各个连通块里面的x轴的个数乘以y轴的个数之和. 然后就变成了一个并查集的问题, 但是这个题目里面有撤 ...

  2. 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)

    传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...

  3. bzoj4025二分图(线段树分治 并查集)

    /* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...

  4. BZOJ3237:[AHOI2013]连通图(线段树分治,并查集)

    Description Input Output Sample Input 4 5 1 2 2 3 3 4 4 1 2 4 3 1 5 2 2 3 2 1 2 Sample Output Connec ...

  5. BZOJ3237 AHOI2013连通图(线段树分治+并查集)

    把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include< ...

  6. BZOJ4025 二分图(线段树分治+并查集)

    之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...

  7. Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)

    题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...

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

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

  9. Codeforces 1140F 线段树 分治 并查集

    题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...

随机推荐

  1. Java内存区域与Java内存模型

    Java内存区域  Java虚拟机在运行程序时会把其自动管理的内存划分为以上几个区域,每个区域都有其用途以及创建销毁的时机,其中蓝色部分代表的是所有线程共享的数据区域,而绿色部分代表的是每个线程的私有 ...

  2. maven项目创建2

    添加依赖索引 但是默认是没有索引的,要手动创建索引 依赖范围 debug  配置 运行常见问题 处理办法,JDK重新安装 网络添加依赖网站

  3. UVA 12063 Zeros and ones 一道需要好好体会的好题

    #include<bits/stdc++.h> #include<stdio.h> #include<iostream> #include<cmath> ...

  4. python脚本中selenium启动浏览器报错os.path.basename(self.path), self.start_error_message) selenium.common.excep

    在python脚本中,使用selenium启动浏览器报错,原因是未安装浏览器驱动,报错内容如下: # -*- coding:utf-8 -*-from selenium import webdrive ...

  5. windows如何正确下载补丁包

    今天公司让给windows安装补丁,打开链接,我蒙蔽了,这么多包要下载哪个腻?下面来跟杨老师一起学习一下如何确定windows版本,下载正确的补丁包. 首先先看一下下载补丁的页面,懵~~ 登录你需要安 ...

  6. idea maven projects 工具栏按钮的作用

    1.Execute Maven Goal  弹出可执行的 Maven 命令的输入框.有些情况下我们需要通过书写某些执行命令来构建项目,就可以通过此按钮 2.Toggle Offline Mode 英文 ...

  7. NOI数论姿势瞎总结(Pi也没有)

    Miller-Rabin素数检测 费马小定理:没人不会吧. 二次探测:如果\(n\)是质数,\(x^2 \equiv 1\ (\mod n)\)的解只有\(x \equiv 1\)或\(x \equi ...

  8. kaliXSSbeef的使用

    Kali中Beef的安装和使用: 先打开终端输入 apt-get install beef-xss 然后切换到beef的安装目录 cd /usr/share/beef-xss 然后启动beef ./b ...

  9. Python argparse 用法总结

    使用argparse的四个基本步骤 创建 ArgumentParser() 对象 调用 add_argument() 方法添加参数 使用 parse_args() 解析添加的参数 # example ...

  10. RESTful API Design

    https://restful-api-design.readthedocs.org/en/latest/scope.html http://blog.mashape.com/30-ways-to-m ...