这题有以下几个步骤

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;
}

最新文章

  1. 如何实现一个php框架系列文章【5】安全处理输入
  2. 矩阵快速幂 HDU 4565 So Easy!(简单?才怪!)
  3. MVC学习系列10---验证系列之服务器端验证
  4. android上引入七牛 上传图片或者文件 最终整理版本(可用)
  5. css相关问题
  6. 【IOI2000】邮局设置问题
  7. java Joda-Time 对日期、时间操作
  8. H.264 基础及 RTP 封包详解
  9. sql语句语法大全
  10. Linux下解决“shutdown: command not found&quot;问题
  11. shell之函数
  12. oracle创建表空间,创建用户(转)
  13. ado通用操作数据单元
  14. UIImageView之我的动画为什么停了?UIImageView, highLighted,animationImages
  15. 求知成瘾+逻辑成瘾+博识的无知,你中枪没?我感觉中枪了 - 外野 - Stage1st - Powered by Discuz!
  16. 一个IT人士的个人经历,给迷失方向的朋友(转)
  17. Node.js初探之GET方式传输
  18. 纯手写AJAX
  19. python_09 文件处理流程,文件操作方法
  20. C#如何调用R

热门文章

  1. unittest详解(七) 自动生成测试报告
  2. javascript 六种数据类型
  3. 生成json文件写入本地
  4. java 开发工具包 jdk 64位 jdk-8u221-windows-x64.exe 迅雷下载
  5. 第五周学习总结&amp;实验报告三
  6. python3笔记十九:os和ospath模块
  7. ImportError: cannot import name &#39;Document&#39;
  8. HOG + SVM(行人检测, opencv实现)
  9. 代码代码:输入两个正整数m和n,求其最大公约数和最小公倍数。15 20 5
  10. doctype是什么?