bzoj 3569 DZY Loves Chinese II 随机算法 树上倍增
题意:给你一个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 随机算法 树上倍增的更多相关文章
- BZOJ 3569 DZY Loves Chinese II 树上差分+线性基
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3569 Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅 ...
- BZOJ 3569 DZY Loves Chinese II
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...
- BZOJ 3569: DZY Loves Chinese II [高斯消元XOR 神题]
http://www.lydsy.com/JudgeOnline/problem.php?id=3569 题意:多次询问一个无向连通图当图中某k条边消失时这个图是否联通 强制在线 太神啦啦啦啦啦啦啦啦 ...
- BZOJ 3569 DZY Loves Chinese II ——线性基
[题目分析] 腊鸡题目卡题面. 大概的意思就是给一张无向图,每次删掉其中一些边,问是否联通. 首先想到的是Bitset,可以做到n^2/64.显然过不了. 然而这是lyd在给我们讲线性基的时候的一道题 ...
- BZOJ 3569: DZY Loves Chinese II(线性基)
传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以 ...
- BZOJ3569 DZY Loves Chinese II(随机化+树上差分+线性基)
上一题的强制在线版.对图跑出一个dfs树,给非树边赋上随机权值,树边的权值为覆盖他的非树边权值的异或.这样如果某条树边和覆盖他的非树边都被割掉(即图不连通),他们的异或值就为0.每次对询问看有没有子集 ...
- BZOJ 3563 DZY Loves Chinese
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...
- [BZOJ3569]DZY Loves Chinese II(随机化+线性基)
3569: DZY Loves Chinese II Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1515 Solved: 569[Submit][S ...
- 【BZOJ3563/3569】DZY Loves Chinese II 线性基神题
[BZOJ3563/3569]DZY Loves Chinese II Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以 ...
随机推荐
- django model 操作总结
使用场景 一对一:在某表中创建一行数据时,有一个单选的下拉框(下拉框中的内容被用过一次就消失了).//两个表的数据一一对应 例如:原有含10列数据的一张表保存相关信息,经过一段时间之后,10列无法满足 ...
- java的基本数据类型有
整型数据根据它所占内容大小的不同可分为4种类型. 数据类型 内存 byte 8位 short 16位 int 32位 long 64位 浮点类型 数据类型 内存 float 32位 double 64 ...
- 2018-2019-2 20175214 实验四《Android程序设计》实验报告
实验四<Android程序设计>实验报告 一.前期准备 安装Android Studio 参考http://www.cnblogs.com/rocedu/p/6371315.html#SE ...
- C/C++中动态内存分配
代码段:用来存放程序执行代码的一块内存区域.这部分内存大小在程序运行前已经知道,通常属于只读,其中包括只读的字符串常量,不可改变 BBS段:用来存放存放程序中未初始化的全局变量及静态变量,属于静态内存 ...
- MySQL主从复制之半同步模式
MySQL主从复制之半同步模式 MySQL半同步介绍: 一般情况下MySQL默认复制模式为异步,何为异步?简单的说就是主服务器上的I/O threads 将binlog写入二进制日志中就返回给客户端一 ...
- Week6 - 676.Implement Magic Dictionary
Week6 - 676.Implement Magic Dictionary Implement a magic directory with buildDict, and search method ...
- ubuntu环境下重启mysql服务报错“No directory, logging in with HOME=-”
前提:使用系统的环境 3.13.0-24-generic mysql的版本:5.6.33 错误描述: 首先用mysqld_safe启动报错如下: root@zabbix-forFunction:~# ...
- 006/搭建fabric(二)
准备vmware虚拟机,并安装完ubuntu系统后.继续搭建fabric运行环境... 0.打开终端,切换root身份.目的:后续操作即可不用sudo... 右键->open Terminal- ...
- 20191105 《Spring5高级编程》笔记-第16章
第16章 Web应用程序 16.3 MVC和Spring MVC介绍 16.3.3 Spring MVC WebApplicationContext层次结构 在Spring MVC中,Dispatch ...
- [19/05/19-星期日] CSS_css的声明和选择器
一.引言 HTML的作用是负责数据的格式展示,如果使用它来搞数据的样式,则发现样式书写出来太麻烦,不易于维护: HTML可以有效组织数据的展示,但是不同类型数据在浏览器中的分布没有办法展示. HTML ...