题意:给你一个n个点m条边的图,有若干组询问,每次询问会选择图中的一些边删除,删除之后问此图是否联通?询问之间相互独立。此题强制在线。

思路:首先对于这张图随便求一颗生成树,对于每一条非树边,随机一个权值。树边的权值为所有覆盖这条树边的非树边的权值异或和。覆盖是指这条边是个返祖边,并且一端在父节点方向,一端在子节点方向。这样,我们选出若干条边,看一下他们异或起来是不是0,如果是0,那么相当于把一条树边和它的所有子节点方向的返祖边全部断开,那么图就不连通了。

代码:

#include <bits/stdc++.h>
#define LL long long
#define pii pair<int, int>
using namespace std;
const int maxn = 100010;
const int maxm = 500010;
const LL mod = 1e18;
mt19937 Random(time(0));
LL get(void) {
return 1ll * Random() * rand();
}
vector<pii> G[maxn], G1[maxn];
LL val[maxn];
int d[maxn], f[maxn][18], t;
bool v[maxn], v1[maxm];
struct edge {
int u, v;
LL w;
};
edge a[maxm];
void add(int x, int y, int id) {
G[x].push_back(make_pair(y, id));
G[y].push_back(make_pair(x, id));
}
void add1(int x, int y, int id) {
G1[x].push_back(make_pair(y, id));
G1[y].push_back(make_pair(x, id));
}
void dfs(int x) {
v[x] = 1;
for (auto y : G[x]) {
if(v[y.first]) continue;
dfs(y.first);
add1(x, y.first, y.second);
v1[y.second] = 1;
}
} queue<int> q;
void bfs() {
q.push(1);
d[1] = 1;
while(q.size()) {
int x = q.front();
q.pop();
for (auto y : G1[x]) {
if(d[y.first]) continue;
d[y.first] = d[x] + 1;
f[y.first][0] = x;
for (int i = 1; i <= t; i++) {
f[y.first][i] = f[f[y.first][i - 1]][i - 1];
}
q.push(y.first);
}
}
} int lca(int x, int y) {
if(d[x] > d[y]) swap(d[x], d[y]);
for (int i = t; i >= 0; i--) {
if(d[f[y][i]] >= d[x]) y = f[y][i];
}
if(x == y) return x;
for (int i = t; i >= 0; i--) {
if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
}
return f[x][0]; }
LL dfs1(int x, int fa) {
for (auto y : G1[x]) {
if(y.first == fa) continue;
dfs1(y.first, x);
a[y.second].w = val[y.first];
val[x] ^= val[y.first];
}
}
struct L_B{
long long d[61],p[61];
int cnt;
void init(){
memset(d,0,sizeof(d));
memset(p,0,sizeof(p));
cnt=0;
}
bool insert(long long val){
for (int i=60;i>=0;i--)
if (val&(1LL<<i))
{
if (!d[i])
{
d[i]=val;
break;
}
val^=d[i];
}
return val>0;
}
long long query_max() {
long long ret=0;
for (int i=60;i>=0;i--)
if ((ret^d[i])>ret)
ret^=d[i];
return ret;
}
long long query_min() {
for (int i=0;i<=60;i++)
if (d[i])
return d[i];
return 0;
}
void rebuild() {
for (int i=60;i>=0;i--)
for (int j=i-1;j>=0;j--)
if (d[i]&(1LL<<j))
d[i]^=d[j];
for (int i=0;i<=60;i++)
if (d[i])
p[cnt++]=d[i];
}
long long kthquery(long long k) {
int ret=0;
if (k>=(1LL<<cnt))
return -1;
for (int i=60;i>=0;i--)
if (k&(1LL<<i))
ret^=p[i];
return ret;
}
};
int main() {
int n, m, cnt = 0, x, y, num, T;
srand(time(0));
scanf("%d%d", &n, &m);
t = (int)(log(n) / log(2)) + 1;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &a[i].u, &a[i].v);
add(a[i].u, a[i].v, i);
}
dfs(1);
bfs();
for (int i = 1; i <= m; i++) {
if(v1[i]) continue;
a[i].w = get();
int tmp = lca(a[i].u, a[i].v);
val[a[i].u] ^= a[i].w;
val[tmp] ^= a[i].w;
val[a[i].v] ^= a[i].w;
val[tmp] ^= a[i].w;
}
dfs1(1, -1);
scanf("%d", &T);
while(T--) {
scanf("%d", &num);
bool flag = 1;
L_B solve;
solve.init();
for (int i = 1; i <= num; i++) {
scanf("%d", &x);
x ^= cnt;
flag = (flag & solve.insert(a[x].w));
}
if(flag == 0) {
printf("Disconnected\n");
} else {
printf("Connected\n");
cnt++;
}
}
}

  

bzoj 3569 DZY Loves Chinese II 随机算法 树上倍增的更多相关文章

  1. BZOJ 3569 DZY Loves Chinese II 树上差分+线性基

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3569 Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅 ...

  2. BZOJ 3569 DZY Loves Chinese II

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

  3. BZOJ 3569: DZY Loves Chinese II [高斯消元XOR 神题]

    http://www.lydsy.com/JudgeOnline/problem.php?id=3569 题意:多次询问一个无向连通图当图中某k条边消失时这个图是否联通 强制在线 太神啦啦啦啦啦啦啦啦 ...

  4. BZOJ 3569 DZY Loves Chinese II ——线性基

    [题目分析] 腊鸡题目卡题面. 大概的意思就是给一张无向图,每次删掉其中一些边,问是否联通. 首先想到的是Bitset,可以做到n^2/64.显然过不了. 然而这是lyd在给我们讲线性基的时候的一道题 ...

  5. BZOJ 3569: DZY Loves Chinese II(线性基)

    传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以 ...

  6. BZOJ3569 DZY Loves Chinese II(随机化+树上差分+线性基)

    上一题的强制在线版.对图跑出一个dfs树,给非树边赋上随机权值,树边的权值为覆盖他的非树边权值的异或.这样如果某条树边和覆盖他的非树边都被割掉(即图不连通),他们的异或值就为0.每次对询问看有没有子集 ...

  7. BZOJ 3563 DZY Loves Chinese

    Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...

  8. [BZOJ3569]DZY Loves Chinese II(随机化+线性基)

    3569: DZY Loves Chinese II Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1515  Solved: 569[Submit][S ...

  9. 【BZOJ3563/3569】DZY Loves Chinese II 线性基神题

    [BZOJ3563/3569]DZY Loves Chinese II Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以 ...

随机推荐

  1. bootstrap-multiselect 设置单选无效(设置单选依然是复选框)

    bootstrap-multiselect 的使用介绍:https://www.cnblogs.com/landeanfen/p/5013452.html bootstrap-multiselect ...

  2. [IOI2008] Fish 鱼

    https://www.luogu.org/recordnew/lists?uid=56840 题解 首先可以发现我们对于每种颜色的鱼,长一点的能够覆盖的方案已定完全包含短一点的方案. 所以我们可以只 ...

  3. Java Interger类,两对整数明明完全一样,为何一个输出true,一个输出false

    package text; public class MethodOverload { public static void main(String[] args) { Integer i1=100; ...

  4. CharacterEncodingFilter详解

    字符编码过滤器  (Spring框架对字符编码的处理) 基于函数回调,对所有请求起作用,只在容器初始化时调用一次,依赖于servlet容器. web.xml配置文件 <filter> &l ...

  5. Microsoft Visual Studio 2013 Language Pack

    Microsoft Visual Studio 2013 Language Pack Microsoft Visual Studio 2013 各版本语言包下载地址: https://my.visua ...

  6. 二十五、python中pickle序列学习(仅python语言中有)

    1.pickle序列介绍:提供4个关键字:dumps,dump,loads,load 语法:f.write(pickle.dumps(dict))=pickle.dump(dict,f) " ...

  7. centOS 7 安装nginx服务

    一.安装相关依赖 yum install gcc-c++ yum install -y pcre pcre-devel yum install -y zlib zlib-devel yum insta ...

  8. spring集成mongodb通过aop记录业务日志

    1. 编辑 pom.xml 添加 maven 依赖 <!-- mongodb --> <dependency> <groupId>org.mongodb</g ...

  9. 记录新建dorado项目更新规则中报错

    异常: Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Er ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_06 Set集合_4_Set集合存储元素不重复的原理

    set集合元素为什么不能重复 集合重写了toString的方法所以打印是里面的内容 往里面存了三次abc 哈希表,初始容量是16个 set集合存储字符串的时候比较特殊 横着是数组,竖着就是链表结构.跟 ...