BZOJ 3569 DZY Loves Chinese II 树上差分+线性基
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3569
Description
Input
Output
Sample Input
2 1
3 2
4 2
5 1
5 3
4 1
4 3
5 2
3 1
5 4
5
1 1
3 7 0 3
4 0 7 4 6
2 2 7
4 5 0 2 13
Sample Output
Connected
Connected
Connected
Disconnected
HINT
N≤100000,M≤500000,Q≤50000,1≤K≤15,数据保证没有重边与自环
Tip:请学会使用搜索引擎
题意概述:
给出一张图,每次假设删除图上K条边,询问图是否连通。
分析:
这操作还是很厉害的......
对于图的问题可以借助和图有关的树来分析。
借助DFS树,我们发现当我们删除一些边的时候,只有我们把某条树边以及所有跨越它的非树边删除掉之后这个图就不连通了。
那么我先现在需要判断给出的边中有没有这样的一些边出现。如果有,那么图就不连通,否则就依旧连通。
怎么判断呢?想到异或,当一些线性相关的数字一起出现的时候,它们的其中一些异或和为0。对于每一条非树边,将其随机一个权值,然后对其跨越的所有边异或上它的权值。每一次询问的时候取出来求线性基,如果线性基插入过程中有数字变成了0,说明给出的数字不是线性不相关。
因为K<=15,所以说可以直接用rand()函数(实在不放心可以手动随机二进制位)。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #include<cstdlib>
- #include<algorithm>
- #include<cmath>
- #include<queue>
- #include<set>
- #include<map>
- #include<vector>
- #include<cctype>
- using namespace std;
- const int maxn=;
- const int maxm=;
- int N,M,Q;
- struct edge{ int to,next; }E[maxm<<];
- int first[maxn],np,fl[maxn],delt[maxn],dfn[maxn],dfs_clock,w[maxm],vis[maxn];
- struct Linear_Base{
- static const int up=;
- int b[up];
- void init(){ memset(b,,sizeof(b)); }
- bool ins(int x){
- for(int i=up-;i>=;i--) if((<<i)&x){
- if(!b[i]) { b[i]=x; break; }
- else x^=b[i];
- }
- return x!=;
- }
- }lb;
- void add_edge(int u,int v)
- {
- E[++np]=(edge){v,first[u]};
- first[u]=np;
- }
- void data_in()
- {
- scanf("%d%d",&N,&M);
- int x,y;
- for(int i=;i<=M;i++){
- scanf("%d%d",&x,&y);
- add_edge(x,y); add_edge(y,x);
- }
- scanf("%d",&Q);
- }
- void DFS(int i,int fp)
- {
- dfn[i]=++dfs_clock,fl[i]=fp;
- for(int p=first[i];p;p=E[p].next){
- if(fp==(p-^)+) continue;
- int j=E[p].to;
- if(dfn[j]){
- if(dfn[j]<dfn[i]){
- w[p+>>]=rand()+;
- delt[i]^=w[p+>>],delt[j]^=w[p+>>];
- }
- continue;
- }
- DFS(j,p);
- w[fp+>>]^=w[p+>>];
- }
- w[fp+>>]^=delt[i];
- }
- void work()
- {
- srand();
- DFS(,);
- int k,x,cnt=;
- for(int i=;i<=Q;i++){
- scanf("%d",&k);
- bool ok=; lb.init();
- for(int j=;j<=k;j++){
- scanf("%d",&x);
- if(ok&&!lb.ins(w[x^cnt])) ok=;
- }
- if(ok) puts("Connected"),cnt++;
- else puts("Disconnected");
- }
- }
- int main()
- {
- data_in();
- work();
- return ;
- }
BZOJ 3569 DZY Loves Chinese II 树上差分+线性基的更多相关文章
- BZOJ 3569: DZY Loves Chinese II(线性基)
传送门 解题思路 首先构造出一个生成树,考虑不连接的情况.假设连通两点的非树边和树边都断掉后不连通,那么可以给所有的非树边随机一个互不相同的值,然后树边的权值为过他两端点的非树边权值的异或和,这个可以 ...
- BZOJ 3569: DZY Loves Chinese II [高斯消元XOR 神题]
http://www.lydsy.com/JudgeOnline/problem.php?id=3569 题意:多次询问一个无向连通图当图中某k条边消失时这个图是否联通 强制在线 太神啦啦啦啦啦啦啦啦 ...
- bzoj 3569 DZY Loves Chinese II 随机算法 树上倍增
题意:给你一个n个点m条边的图,有若干组询问,每次询问会选择图中的一些边删除,删除之后问此图是否联通?询问之间相互独立.此题强制在线. 思路:首先对于这张图随便求一颗生成树,对于每一条非树边,随机一个 ...
- BZOJ 3569 DZY Loves Chinese II
Description 神校XJ之学霸兮,Dzy皇考曰JC. 摄提贞于孟陬兮,惟庚寅Dzy以降. 纷Dzy既有此内美兮,又重之以修能. 遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上 ...
- BZOJ 3569 DZY Loves Chinese II ——线性基
[题目分析] 腊鸡题目卡题面. 大概的意思就是给一张无向图,每次删掉其中一些边,问是否联通. 首先想到的是Bitset,可以做到n^2/64.显然过不了. 然而这是lyd在给我们讲线性基的时候的一道题 ...
- 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既有此内美兮,又重之以 ...
- 【BZOJ3569】DZY Loves Chinese II
[BZOJ3569]DZY Loves Chinese II 题面 bzoj 题目大意: 给你一张\(N(1\leq N\leq 10^5)\)个点\(M(1\leq M\leq 5\times 10 ...
随机推荐
- UGUI富文本
<b>text</b> --粗体 <i>text<i> --斜体 <size=10>text</size> --自 ...
- Java经典书籍-PDF
密码:rhgr https://pan.baidu.com/s/17MkdVFS9JrsbseMveQePOQ
- Oracle 差异性增量 和 累计增量 原理(转)
RMAN一个强大的功能是支持增量备份,增量备份中心思想就是减少备份的数据量,我们不需要在从头开始备份了,只需要备份自上次已备份之后的数据块即可. Oracle 9i 共有五种级别 0 1 2 3 ...
- swap, 不用临时变量如何做到交换a与b
固定思维通常是需要一个临时变量temp,如果没有这个临时变量呢,其实也不复杂,:) inline void swap(int &a, int &b) /*C用指针吧*/ { a = a ...
- VMware ESXi-6.7——安装
前提条件: 下载ESXi-ISO镜像文件 制作启动文件 将服务器调试为U盘启动 进入U盘启动模式 1. 进入ESXi的安装页面 选择要安装的磁盘 选择USB口驱动 设置一个root密码 保存数据提示 ...
- MySQL中Date,DateTime,TimeStamp和Time的比较
名称 显示格式 显示范围 应用场景 后台取值 Date YYYY-MM-DD 1601-01-01 到 9999-01-01 当业务需求中只需要精确到天时, 可以用这个时间格式 @JSONField( ...
- 序列化serialize()与反序列化unserialize()的实例
在写序列化serialize与反序列化unserialize()时,我们先来看看: serialize - 产生一个可存储的值的表示 描述 string serialize ( mixed $valu ...
- 使用Python第三方库生成二维码
本文主要介绍两个可用于生成二维码的Python第三方库:MyQR和qrcode. MyQR的使用: 安装: pip install MyQR 导入: from MyQR import myqr imp ...
- Vue.js中 computed 和 methods 的区别
官方文档中已经有对其的解释了,在这里把我的理解记录一下Vue中的methods.watch.computed computed 的使用场景 HTML模板中的复杂逻辑表达式,为了防止逻辑过重导致不易维护 ...
- JDBC与Statement和PreparedStatement的区别
一.先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接的基础上,向数据库发送要执行的SQL语句.具体步骤: 1.首先导入 ...