Codeforces 1140F Extending Set of Points (线段树分治+并查集)
这题有以下几个步骤
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 (线段树分治+并查集)的更多相关文章
- Codeforces 1140F Extending Set of Points 线段树 + 按秩合并并查集 (看题解)
Extending Set of Points 我们能发现, 如果把x轴y轴看成点, 那么答案就是在各个连通块里面的x轴的个数乘以y轴的个数之和. 然后就变成了一个并查集的问题, 但是这个题目里面有撤 ...
- 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...
- bzoj4025二分图(线段树分治 并查集)
/* 思维难度几乎没有, 就是线段树分治check二分图 判断是否为二分图可以通过维护lct看看是否链接出奇环 然后发现不用lct, 并查集维护奇偶性即可 但是复杂度明明一样哈 */ #include ...
- 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 ...
- BZOJ3237 AHOI2013连通图(线段树分治+并查集)
把查询看做是在一条时间轴上.那么每条边都有几段存在时间.于是线段树分治就好了. 然而在bzoj上t掉了,不知道是常数大了还是写挂了. 以及brk不知道是啥做数组名过不了编译. #include< ...
- BZOJ4025 二分图(线段树分治+并查集)
之前学了一下线段树分治,这还是第一次写.思想其实挺好理解,即离线后把一个操作影响到的时间段拆成线段树上的区间,并标记永久化.之后一块处理,对于某个节点表示的时间段,影响到他的就是该节点一直到线段树根的 ...
- Bzoj1018/洛谷P4246 [SHOI2008]堵塞的交通(线段树分治+并查集)
题面 Bzoj 洛谷 题解 考虑用并查集维护图的连通性,接着用线段树分治对每个修改进行分治. 具体来说,就是用一个时间轴表示图的状态,用线段树维护,对于一条边,我们判断如果他的存在时间正好在这个区间内 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
- Codeforces 1140F 线段树 分治 并查集
题意及思路:https://blog.csdn.net/u013534123/article/details/89010251 之前cf有一个和这个相似的题,不过那个题只有合并操作,没有删除操作,直接 ...
随机推荐
- react 中的路由 属性exact
https://www.cnblogs.com/nailc/p/8718137.html(copy)
- ASE高级软件工程 第一次结对作业
黄金点游戏Bot Bot8前来报道 1.问题定义 a) 问题描述 N个玩家,每人写一个0~100之间的有理数 (不包括0或100),提交给服务器,服务器在当前回合结束时算出所有数字的平均值,然后乘以0 ...
- 彩色图像--色彩空间 CMY(K)空间
学习DIP第63天 转载请标明本文出处:***http://blog.csdn.net/tonyshengtan ***,出于尊重文章作者的劳动,转载请标明出处!文章代码已托管,欢迎共同开发:http ...
- MySQL数据库入门———常用基础命令
mysql 连接数据库命令: MySQL 连接本地数据库,用户名为“root”,密码“123”(注意:“-p”和“123” 之间不能有空格) mysql -h localhost -u root -p ...
- ubuntu开启ssh服务时,报:start:Unknown job : ssh
这里是参考网站资料,并记录下. 如图所示: 解决方法: 输入以下命令即可 /usr/sbin/sshd mkdir /var/run/sshd /usr/sbin/sshd netstat -nlt ...
- JSON格式标准
JSON格式 json的基本类型有objects(dicts), arrays(lists), strings, numbers, booleans, and nulls(json中关键字).在一个o ...
- Zookeeper入门(六)之zkCli.sh对节点的增删改查
参考地址为:https://www.cnblogs.com/sherrykid/p/5813148.html 1.连接 在 bin 目录下的 zkCli.sh 就是ZooKeeper客户端 ./z ...
- dell 9代cpu新机器安装centos7.7 bios 配置
1.步骤如下,按f2或f12选择进入bios,每一步配置的内容如图所示,U盘写镜像,引导U盘启动,安装.(电源管理自启动那几个步骤可以不做)
- JAVA-ThreadPoolExecutor 线程池
一.创建线程池 /** * @param corePoolSize 核心线程池大小 * 当提交一个任务到线程池时,如果当前 poolSize < corePoolSize 时,线程池会创建一个线 ...
- java 方法的重载重写
面向对象有三大特性:封装,继承,多态 多态则需要满足三大条件1要有继承2要有重写3父类引用子类对象 很多人对方法的重载重写有很大疑问,下面我来介绍一下方法的重载重写 方法重载就是方法名称重复,加载参数 ...