以下这个做法应该是叫线段树分治。。。

根据修改操作预处理出每条边存在的时间区间[l,r](以操作序号为时间),然后把所有形式化后的修改挂到线段树节点上。

处理完修改后,dfs一遍线段树,进入某个节点时把那个点上所有的修改操作做一遍连边(用按秩合并并查集),出来时再撤销那些连边;那么到达叶节点时,刚好就是完成了这个节点代表的时间所需要的一切修改操作

复杂度O(nlog^2n),比lct要大

这个东西跟cdq分治一样是时间分治,但是好像不能降维的样子(?反正想了很久没想通),不过能在有些有加入、删除、查询操作的题中,把删除操作规避掉

以下代码把线段树避免掉了(其实是处理过程中把树建出来。。。)

 #include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#define pb push_back
using namespace std;
struct Info
{
int fx,fy,dx,dy;
}ttt[];
int tlen;
struct Q
{
bool type;
int l,r,a,b;
};
bool ans[];
int qnum,n,m;
char tmp[];
map<int,int> ma[];
map<int,int>::iterator it;
int fa[],dep[];
int find(int x)
{
for(;x!=fa[x];x=fa[x]);
return x;
}
void add(const Q &x)
{
int fx=find(x.a),fy=find(x.b);++tlen;
ttt[tlen].fx=fx;ttt[tlen].fy=fy;
ttt[tlen].dx=dep[fx];ttt[tlen].dy=dep[fy];
if(dep[fx]>dep[fy]) fa[fy]=fx;
else
{
fa[fx]=fy;
if(dep[fx]==dep[fy]) dep[fy]++;
}
}
void del(int tm)
{
for(int i=,fx,fy;i<=tm;i++)
{
fx=ttt[tlen].fx;fy=ttt[tlen].fy;
fa[fx]=fx;fa[fy]=fy;
dep[fx]=ttt[tlen].dx;dep[fy]=ttt[tlen].dy;
--tlen;
}
}
void solve(const vector<Q> &q,int l,int r)
//当前线段树上区间为[l,r],要处理的询问为q
{
int i,nn=,sz=q.size();
if(l==r)
{
for(i=;i<sz;i++)
if(q[i].type==)
add(q[i]),++nn;
for(i=;i<sz;i++)
if(q[i].type==)
ans[l]=find(q[i].a)==find(q[i].b);
del(nn);
return;
}
int mid=l+(r-l)/;vector<Q> qq1,qq2;
for(i=;i<sz;i++)
{
if(q[i].type==)
{
if(q[i].l<=l&&r<=q[i].r) add(q[i]),++nn;
else
{
if(q[i].l<=mid) qq1.push_back(q[i]);
if(mid<q[i].r) qq2.push_back(q[i]);
}
}
else
{
if(q[i].l<=mid) qq1.pb(q[i]);
else qq2.pb(q[i]);
}
}
solve(qq1,l,mid);
solve(qq2,mid+,r);
del(nn);
}
vector<Q> q;
bool type[];
int main()
{
int i,a,b;
scanf("%d%d",&n,&m);
for(i=;i<=n;i++) fa[i]=i;
for(i=;i<=m;i++)
{
scanf("%s%d%d",tmp,&a,&b);if(a>b) swap(a,b);
if(tmp[]=='Q') q.pb((Q){,i,,a,b}),type[i]=;
else if(tmp[]=='C') ma[a][b]=i;
else if(tmp[]=='D') q.pb((Q){,ma[a][b],i,a,b}),ma[a].erase(b);
}
for(i=;i<=n;i++)
for(it=ma[i].begin();it!=ma[i].end();it++)
q.pb((Q){,it->second,m,i,it->first});
solve(q,,m);
for(i=;i<=m;i++)
if(type[i]==)
puts(ans[i]?"Yes":"No");
return ;
}

洛谷 P2147 [SDOI2008]洞穴勘测的更多相关文章

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

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

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

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

  3. 洛谷 P2147 [SDOI2008]洞穴勘测 (线段树分治)

    题目链接 题解 早就想写线段树分治的题了. 对于每条边,它存在于一段时间 我们按时间来搞 我们可把一条边看做一条线段 我们可以模拟线段树操作,不断分治下去 把覆盖\(l-r\)这段时间的线段筛选出来, ...

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

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

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

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

  6. 【洛谷P2147】洞穴勘测

    题目大意:维护 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. 洛谷P2147 [SDOI2008]Cave 洞穴勘测

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

随机推荐

  1. Linq To Sql进阶系列(六)用object的动态查询与保存log篇

    动态的生成sql语句,根据不同的条件构造不同的where字句,是拼接sql 字符串的好处.而Linq的推出,是为了弥补编程中的 Data != Object 的问题.我们又该如何实现用object的动 ...

  2. 设计模式学习笔记——Chain of Responsibility职责链模式

    重点在链.一条链,如果本节点处理不了,则传递给下一个节点处理. 关键是如何传给下一个节点? 主要是由本节点决定传给哪一个节点. public class Client { public static ...

  3. Codeforces Round #422 (Div. 2) D. My pretty girl Noora 数学

    D. My pretty girl Noora     In Pavlopolis University where Noora studies it was decided to hold beau ...

  4. bash shell和进程

    1 exec builtin 不创建子shell,在原进程的上启动新的脚本,但是它会把老shell的环境清理掉,所以,它从原shell中什么也不继承,在一个干净的环境中执行新的脚本.执行完之后退出当前 ...

  5. iOS UI控件之间的关系图

  6. 无线网络中的MAC协议(1)

    前文我们对传统的有线网络的MAC协议进行了分析,接下来我们在对无线网络的MAC也进行一个详细的介绍.那么无线网络中的MAC工作方式是如何的呢?无线局域网(WLAN)中MAC所对应的标准为IEEE 80 ...

  7. javascript:;用法集锦

    如果是个# ,就会出现跳到顶部的情况,个人收藏的几种解决方法:1:<a href="####"></a> 2:<a href="javasc ...

  8. Scrapy爬虫报错:ModuleNotFoundError: No module named 'win32api'

    运行 scrapy crawl douban_spider 出现报错: 解决办法:安装pywin32,下载适配安装的Python版本(64位,Python3.6) 下载地址: https://sour ...

  9. @Data 注解在实体类的使用可省去生成GET,SET方法

    你有没有觉得在每个实体类中都要生成get,set方法很麻烦, 要是需求的变化,需要再加一个字段,添加属性后则又要添加其get,set方法 现有一个很好用的注解能解决这个麻烦 1,idea中装上 lom ...

  10. 转:创建表空间,删除后再次创建,报错ORA-01119

    原文:http://www.it2down.com/it-oracle-develop/57816.htm 我是个ORACLE新手,在删除了表空间,然后再创建怎么会提示出错? 删除表空间:drop t ...