这题有以下几个步骤

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. pycharm2018.3 x64激活

    今天把pycharm从2018.2.4更新到了2018.3.7,需要重新激活,激活方式如下: 1.修改hosts文件,将下面两句话添加到hosts文件,保存 0.0.0.0 account.jetbr ...

  2. PyCharm中Qt Designer+PyUIC配置

    本文环境配置: 系统=>windows10:64位 语言=>Python:3.7.1 第三方库PyQT5:5.11.3pyqt5-tools:5.11.3.1.4 工具=>PyCha ...

  3. hash索引

    hash算法 哈希表(hash table ,也叫散列表),是根据关键码值(key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.这个 ...

  4. 前端开发——让算法"动"起来

    正文 当然在我们不清楚具体操作细节前我们可以先假设一下,我们能够用什么来实现.按照以前看过的排序动画我将其分为 1.Js操作Dom,再搭配简单的css 2.Canvas动画 之后在查资料的时候发现还有 ...

  5. 利用Zookeeper实现分布式锁

    特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过.如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/ ...

  6. 一起学vue指令之v-pre

    一起学vue指令之v-pre 一起学 vue指令 v-pre  指令可看作标签属性 浏览器解析引擎遇到vue的插值符号时会自动解析,当你想输出不被解析的纯文本时,可以使用v-pre指令. 未使用v-p ...

  7. UVA 122 -- Trees on the level (二叉树 BFS)

     Trees on the level UVA - 122  解题思路: 首先要解决读数据问题,根据题意,当输入为“()”时,结束该组数据读入,当没有字符串时,整个输入结束.因此可以专门编写一个rea ...

  8. Java反序列化与远程代码执行

    https://mp.weixin.qq.com/s/asQIIF8NI_wvur0U0jNvGw 原创: feng 唯品会安全应急响应中心 2017-09-19 https://mp.weixin. ...

  9. 浏览器端-W3School-JavaScript:JavaScript 全局对象

    ylbtech-浏览器端-W3School-JavaScript:JavaScript 全局对象 1.返回顶部 1. JavaScript 全局对象 全局属性和函数可用于所有内建的 JavaScrip ...

  10. 学习笔记 - Git

    学习参考网址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 Git是目前世界上 ...