题意:给你一个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. CG-CTF | Hello,RE!

    菜狗开始向着pwn与re进军了(●'◡'●)[说白了,还是在水博客吧] 按r出flag: galf    leW{    emoc    _oT_    W_ER  dlro   }! 反一下:fla ...

  2. 《SQL Server 2012 T-SQL基础》读书笔记 - 5.表表达式

    Chapter 5 Table Expressions 一个表表达式(table expression)是一个命名的查询表达式,代表一个有效的关系表.SQL Server包括4种表表达式:派生表(de ...

  3. (转)JNI参数传递|Surface && sign签名对应

    http://blog.csdn.net/stefzeus/article/details/6622011 char* Get_Surface(JNIEnv *env, jclass cls, job ...

  4. r hive

    w r只能处理有限量的数据 pdf 467

  5. (转)flexpaper 参数

    本文转载自:http://blog.csdn.net/z69183787/article/details/18659913 Flexpaper可能用到如下参数   SwfFile (String) 需 ...

  6. 织梦自定义表单导出为excel功能

    1.首先在后台修改/dede/templets/diy_main.htm <a href="../plus/diy.php?action=daochu&diyid={dede: ...

  7. 错误 warning: LF will be replaced by CRLF in README.md.

    问题类型 windows中的换行符为 CRLF, 而在Linux下的换行符为LF,所以在执行add . 时出现提示:warning: LF will be replaced by CRLF in RE ...

  8. Delphi XE2 之 FireMonkey 入门(10) - 常用结构 TPoint、TPointF、TSmallPoint、TSize、TRect、TRectF 及相关方法

    它们都是结构, TPointF.TRectF 属新增, 其它也都有升级; 现在都拥有丰富的方法和方便的运算符重载; 且有一组相关的公共函数. 这组内容重要的是它们都来自 System.Types 单元 ...

  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_9_字节输入流读取字节数据

    硬盘读取到内存   read值会读一个字节 a.txt里面a变成整数就是97   读取到末尾,返回-1 再读一次还是-1 读取的代码是重复的.可以使用循环去读取.while循环. 转行成char类型的 ...

  10. c# Thread——1.为什么Abort中断线程是不可靠的

    Thread.Abort 方法在c#中用作强制中断线程的执行,大多用于线程内部满足某个特定条件而自己调用关闭自身,比如下面的代码在i自增到3的时候就会停止打印. class Program { sta ...