博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces 1140F Extending Set of Points (线段树分治+并查集)
阅读量:5009 次
发布时间:2019-06-12

本文共 1995 字,大约阅读时间需要 6 分钟。

这题有以下几个步骤

1.离线处理出每个点的作用范围
2.根据线段树得出作用范围
3.根据分治把每个范围内的点记录和处理

#include
using namespace std;typedef long long ll;const int maxn = 3e5 + 50;typedef pair
pii;#define bug cout << "bug" << endl;vector
rt[maxn << 2];void update(int o,int l,int r,int ql,int qr,pii pi){ //cout << "o=" << o <<" l="<
<<" r="<
<<" ql="<
<<" 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
&st){ int xx = find(x); int yy = find(y); if(xx==yy) return; if(sz[xx]
&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
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
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;}

转载于:https://www.cnblogs.com/luowentao/p/10815744.html

你可能感兴趣的文章
执行指定路径的程序文件
查看>>
Leetcode-950 Reveal Cards In Increasing Order(按递增顺序显示卡牌)
查看>>
[Linux] 在 Linux CLI 使用 ssh-keygen 生成 RSA 密钥
查看>>
14款下载有用脚本的超酷网站
查看>>
LXC-Linux Containers介绍
查看>>
7.31实习培训日志-docker sql
查看>>
c#中使用servicestackredis操作redis
查看>>
ios app 真机crash报告分析
查看>>
CRC标准以及简记式
查看>>
SEO搜索引擎
查看>>
关于本地使用tomcat部署web应用,浏览器自动跳转为https的问题
查看>>
一、Text To Speech
查看>>
Java读取并下载网络文件
查看>>
github上构建自己的个人网站
查看>>
在word中粘贴的图片为什么显示不完整
查看>>
SQL Server 数据库的鼠标操作
查看>>
net软件工程师求职简历
查看>>
总线置顶[置顶] Linux bus总线
查看>>
nullnullHandling the Results 处理结果
查看>>
SQL SERVER BOOK
查看>>