洛谷 P2147 [SDOI2008]洞穴勘测
以下这个做法应该是叫线段树分治。。。
根据修改操作预处理出每条边存在的时间区间[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]洞穴勘测的更多相关文章
- 洛谷P2147[SDOI2008]洞穴勘测(lct)
题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...
- [洛谷P2147][SDOI2008]洞穴勘测
题目大意:有$n$个洞穴,$m$条指令,指令有三种 $Connect\;u\;v$:在$u,v$之间连一条边 $Destroy\;u\;v$:切断$u,v$之间的边 $Query\;u\;v$:询问$ ...
- 洛谷 P2147 [SDOI2008]洞穴勘测 (线段树分治)
题目链接 题解 早就想写线段树分治的题了. 对于每条边,它存在于一段时间 我们按时间来搞 我们可把一条边看做一条线段 我们可以模拟线段树操作,不断分治下去 把覆盖\(l-r\)这段时间的线段筛选出来, ...
- 洛谷 P2147 [SDOI2008]洞穴勘测 LCT
Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...
- 洛谷P2147 [SDOI2008] 洞穴勘探 [LCT]
题目传送门 洞穴勘探 题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道 ...
- 【洛谷P2147】洞穴勘测
题目大意:维护 N 个点的无向图,支持动态加边和删边,回答两点的连通性. 题解:线段树分治 + 可撤销并查集 询问可以离线,这是线段树分治的基础. 建立在操作时间轴上的线段树称为线段树分治算法. 本题 ...
- P2147 [SDOI2008]洞穴勘测(LCT)
P2147 [SDOI2008]洞穴勘测 裸的LCT. #include<iostream> #include<cstdio> #include<cstring> ...
- P2147 [SDOI2008]洞穴勘测
P2147 [SDOI2008]洞穴勘测 思路 没办法,我就是喜欢板子都想发的人 都是基础操作,不多说了 代码 #include <bits/stdc++.h> #define ls ch ...
- 洛谷P2147 [SDOI2008]Cave 洞穴勘测
题目描述 辉辉热衷于洞穴勘测. 某天,他按照地图来到了一片被标记为JSZX的洞穴群地区.经过初步勘测,辉辉发现这片区域由n个洞穴(分别编号为1到n)以及若干通道组成,并且每条通道连接了恰好两个洞穴.假 ...
随机推荐
- Centos修改静态IP
vim /etc/sysconfig/network-scripts/ifcfg-eth0代开配置文件 写入 DEVICE=eth0 #描述网卡对应的设备别名,例如ifcfg-eth0的文件中它为et ...
- (testng多个class文件执行时混乱,不是等一个class内的所有methods执行完再去执行下一个class内的内容)问题的解决
问题描述如下: We use TestNG and Selenium WebDriver to test our web application. Now our problem is that we ...
- STL--map用法
STL--map用法map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力由于这个特性它完成有可能在我们处理 ...
- 有遍历struct中字段信息的函数或方法
例:struct a{int a;char b[10];double c;}; 在程序中只知道一个结构 a 的指针, 有没有函数能通过结构的名字 和 指向结构的指针 随次得到 结构中的变量类型 和 变 ...
- ZOJ 3874 Permutation Graph 分治NTT
Permutation Graph Time Limit: 2 Seconds Memory Limit: 65536 KB Edward has a permutation {a1, a2 ...
- Java的编程逻辑--15章 并发基础
1.run()和start()的区别 2.线程的基本属性和方法 id:一个递增的整数,每创建一个线程就加一 name 优先级:从1到10,默认为5,会映射到系统中的优先级.数字越大,要优先级越高 状态 ...
- (最新)各大公司Java后端开发面试题总结
ThreadLocal(线程变量副本) Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量. 采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一 ...
- java里类方法和实例方法
实例方法相对于静态方法(或者叫类方法)而言没有 static 前缀类般方法被对象拥有(也称之实例方法原因)特点定义时候前面没有 static 前缀本类直接调用时候必须也实例方法内否则调用前必须先实例出 ...
- POJ1459 Power Network —— 最大流
题目链接:https://vjudge.net/problem/POJ-1459 Power Network Time Limit: 2000MS Memory Limit: 32768K Tot ...
- HDU 1081:To The Max
To The Max Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...