题目链接

题解

早就想写线段树分治的题了。

对于每条边,它存在于一段时间

我们按时间来搞

我们可把一条边看做一条线段

我们可以模拟线段树操作,不断分治下去

把覆盖\(l-r\)这段时间的线段筛选出来,用并查集维护联通性,回溯时撤销操作

注意不能使用路径压缩(不能破坏树的结构,方便撤销操作)

Code

#include<bits/stdc++.h>
#define LL long long
#define RG register
using namespace std; inline int gi() {
int f = 1, s = 0;
char c = getchar();
while (c != '-' && (c < '0' || c > '9')) c = getchar();
if (c == '-') f = -1, c = getchar();
while (c >= '0' && c <= '9') s = s*10+c-'0', c = getchar();
return f == 1 ? s : -s;
} const int N = 10010, M = 200010; struct question {
int time, u, v;
}q[M];
int ql, w; struct bian {
int u, v, s, e;
};
vector<bian> g;
map<pair<int, int>, int> Mp;
int siz[N], fa[N];
inline int find(int x) {
return x == fa[x] ? x : find(fa[x]);
}
pair<int, int> stk[M];
int top; void link(int x, int y) {//按秩合并
x = find(x); y = find(y);
if (x == y) {
stk[++top] = make_pair(0, 0);
return ;
}
if (siz[x] < siz[y]) swap(x, y);
stk[++top] = make_pair(x, y);//y接在x上
fa[y] = x;
siz[x] += siz[y];
return ;
} void clear() {//撤销操作
int x = stk[top].first, y = stk[top--].second;
if (!x && !y) return ;
fa[y] = y;
siz[x] -= siz[y];
return ;
} void divide(int l, int r, vector<bian> E) {
vector<bian> L, R;
int tmp = top, mid = (l + r) >> 1;
for (int i = 0; i < (int)E.size(); i++) {
if (E[i].s <= l && E[i].e >= r) link(E[i].u, E[i].v);
else {
if (E[i].s <= mid) L.push_back(E[i]);
if (E[i].e > mid) R.push_back(E[i]);
}
}
if (l == r) {
while (q[w].time == l && w <= ql) {
if (find(q[w].u) == find(q[w].v)) printf("Yes\n");
else printf("No\n");
w++;
}
if (w > ql) exit(0);
return ;
}
else divide(l, mid, L), divide(mid+1, r, R);
while (top > tmp) clear();
return ;
} int main() {
int n = gi(), m = gi(), x, y;
char s[10];
for (int i = 1; i <= m; i++) {
cin >> s >> x >> y;
if (x > y) swap(x, y);
if (s[0] == 'C') {
if (Mp.find(make_pair(x, y)) == Mp.end())
g.push_back((bian){x, y, i, m}), Mp[make_pair(x, y)] = g.size()-1;
}
else if (s[0] == 'D') {
g[Mp[make_pair(x, y)]].e = i-1;
Mp.erase(Mp.find(make_pair(x, y)));
}
else q[++ql] = (question) {i, x, y};
}
/*for (int i = 0; i < g.size(); i++)
printf("%d %d %d %d\n", g[i].u, g[i].v, g[i].s, g[i].e);*/
w = 1;
for (int i = 1; i <= n; i++) fa[i] = i, siz[i] = 1;
divide(1, m, g);
return 0;
}

洛谷 P2147 [SDOI2008]洞穴勘测 (线段树分治)的更多相关文章

  1. 洛谷 P2147 [SDOI2008]洞穴勘测

    以下这个做法应该是叫线段树分治... 根据修改操作预处理出每条边存在的时间区间[l,r](以操作序号为时间),然后把所有形式化后的修改挂到线段树节点上. 处理完修改后,dfs一遍线段树,进入某个节点时 ...

  2. 洛谷P2147[SDOI2008]洞穴勘测(lct)

    题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...

  3. [洛谷P2147][SDOI2008]洞穴勘测

    题目大意:有$n$个洞穴,$m$条指令,指令有三种 $Connect\;u\;v$:在$u,v$之间连一条边 $Destroy\;u\;v$:切断$u,v$之间的边 $Query\;u\;v$:询问$ ...

  4. 洛谷 P2147 [SDOI2008]洞穴勘测 LCT

    Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...

  5. 【洛谷P2147】洞穴勘测

    题目大意:维护 N 个点的无向图,支持动态加边和删边,回答两点的连通性. 题解:线段树分治 + 可撤销并查集 询问可以离线,这是线段树分治的基础. 建立在操作时间轴上的线段树称为线段树分治算法. 本题 ...

  6. 洛谷P2147 [SDOI2008] 洞穴勘探 [LCT]

    题目传送门 洞穴勘探 题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道 ...

  7. P2147 [SDOI2008]洞穴勘测(LCT)

    P2147 [SDOI2008]洞穴勘测 裸的LCT. #include<iostream> #include<cstdio> #include<cstring> ...

  8. P2147 [SDOI2008]洞穴勘测

    P2147 [SDOI2008]洞穴勘测 思路 没办法,我就是喜欢板子都想发的人 都是基础操作,不多说了 代码 #include <bits/stdc++.h> #define ls ch ...

  9. 洛谷 P3373 【模板】线段树 2

    洛谷 P3373 [模板]线段树 2 洛谷传送门 题目描述 如题,已知一个数列,你需要进行下面三种操作: 将某区间每一个数乘上 xx 将某区间每一个数加上 xx 求出某区间每一个数的和 输入格式 第一 ...

随机推荐

  1. Rails 和 Django 的深度技术对比

    我想以一个免责声明来开始下面的内容.我使用 Django开发网站已经有三年了,众所周知,我喜欢Django.我已经写了一个开源的应用程序( app),并且我已经将补丁发送到了Django.然而,我以尽 ...

  2. keepalived配置

    keepalived配置 之前已经安装完成,接下来我们配置keepalived. 假设我的ip地址如下: server1:192.168.0.150 server2:192.168.0.157 vip ...

  3. Win10 DHCP和Static IP 切换

    创建两个.bat文件,分别命名为static.bat和dhcp.bat static.bat文件写入 netsh interface ip set address "Wi-Fi" ...

  4. Vue.js组件调用用及其组件通信

    1.需要import,然后components注册.然后如下代码调用. <template> <header></header> //注册后才能这样使用 <b ...

  5. ServletContext作用功能详解.RP

    ServletContext ServletContext,是一个全局的储存信息的空间,服务器开始,其就存在,服务器关闭,其才释放.request,一个用户可有多个:session,一个用户一个:而s ...

  6. css属性position的运用

    随着web标准的规范化,网页的布局也随之千变万化.各种复杂漂亮有创意的页面布局冲 击这人们的视野,相比以前的table布局那就不是一等级的事儿.这个很大一部分功劳是css 样式的引入.而这个多样性布局 ...

  7. 解决Tomcat错误信息:No 'Access-Control-Allow-Origin' header is present on the requested resource | Solving Tomcat Error: No 'Access-Control-Allow-Origin' header is present on the requested resource

    最近在使用GeoServer调用Vector Tile服务时,经常会显示不出来结果.打开浏览器调试台,发现报No 'Access-Control-Allow-Origin' header is pre ...

  8. LibreOJ 6000 搭配飞行员(最大流)

    题解:最基础的最大流,按照主飞行员与起点建边,副飞行员与终点建边,可以同坐的主副飞行员之间建边,值均为一,然后跑一边最大流就完美了! 代码如下: #include<queue> #incl ...

  9. java类创建时里面成员执行的先后顺序

    静态代码块在类第一次使用的时候执行一次,在构造函数执行之前执行.只要用到类,哪怕new对象(比如只声明变量)也会被执行,且只执行一次.一般用于对类进行初始化. 先执行静态代码块,静态成员(谁在前就先执 ...

  10. 洛谷P1251 餐巾计划问题(费用流)

    传送门 不得不说这题真是思路清奇,真是网络流的一道好题,完全没想到网络流的建图还可以这么建 我们把每一个点拆成两个点,分别表示白天和晚上,白天可以得到干净的餐巾(购买的,慢洗的,快洗的),晚上可以得到 ...