BZOJ 3563 DZY Loves Chinese 并查集

题目大意:给定一个无向联通图,q次询问当图中某k条边消失时图是否联通 强制在线

逗比题233

不明白什么意思的去看DZY Loves Chinese II的红字就明白这题为何逗比了0.0

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 100100
using namespace std;
struct edges{
    int x,y;
}e[500500];
int n,m,q,block;
bool v[500500];
char s[1010];
int fa[M],ans[M];
int Find(int x)
{
    if(!fa[x]||fa[x]==x)
        return fa[x]=x;
    return fa[x]=Find(fa[x]);
}
void Unite(int x,int y)
{
    x=Find(x);y=Find(y);
    if(x==y) return ;
    fa[x]=y;block--;
}
int main()
{
    int i,j,k,_k;
    cin>>n>>m;
    for(i=1;i<=m;i++)
        scanf("%d%d",&e[i].x,&e[i].y);
    cin>>q;
    for(i=1;i<=q;i++)
    {
        scanf("%d",&_k);
        gets(s+1);k=0;
        for(j=1;s[j];j++)
            if( isdigit(s[j]) && !isdigit(s[j+1]) )
                ++k;
        ans[i]=k^_k;
    }
    for(i=1;i<q;i++)
        printf("%s\n",ans[i+1]-ans[i]?"Connected":"Disconnected");
    int temp=0;
    for(i=1,s[0]='a';s[i-1];i++)
    {
        if( isdigit(s[i]) )
            temp*=10,temp+=s[i]-'0';
        else if( isdigit(s[i-1]) )
            v[temp^ans[q]]=1,temp=0;
    }
    block=n;
    for(i=1;i<=m;i++)
        if(!v[i])
            Unite(e[i].x,e[i].y);
    puts(block==1?"Connected":"Disconnected");
    return 0;
}
时间: 2024-10-10 18:34:49

BZOJ 3563 DZY Loves Chinese 并查集的相关文章

BZOJ 3563 DZY Loves Chinese / BZOJ 3569 DZY Loves Chinese II 随机化+高斯消元解异或方程组

题目大意:给出一个无向图,问删掉k条边的时候,图是否联通. 思路:虽然我把这两个题放在了一起,但是其实这两个题可以用完全不同的两个解法来解决. 第一个题其实是DZY出错了...把每次的边数也异或了,那就直接用这个性质一个一个往后推就行了..最后一个暴力求一下.. 第二个题才是本意啊. 听到做法的时候我惊呆了.. 首先是将整个图中拆出一个树,那么所有边就分为树边和非树边.将所有非树边都加一个随机权值.树边的权值是所有能够覆盖它的非树边的权值的异或和. 把整个图拆开的充要条件是拆掉一条树边,同时将所

BZOJ 3563 DZY Loves Chinese

题解:为每条非树边赋一个权值 每条树边的权值为覆盖他的非树边权值异或和 如果边集的子集线性相关,相当于把树边和非树边拦腰砍断,则不连通 用线性基判断线性相关 问题:为什么srand(time(0))会RE? #include<iostream> #include<cstdio> #include<cstring> #include<ctime> #include<cstdlib> using namespace std; const int ma

3563: DZY Loves Chinese - BZOJ

Description神校XJ之学霸兮,Dzy皇考曰JC.摄提贞于孟陬兮,惟庚寅Dzy以降.纷Dzy既有此内美兮,又重之以修能.遂降临于OI界,欲以神力而凌♂辱众生. 今Dzy有一魞歄图,其上有N座祭坛,又有M条膴蠁边.时而Dzy狂WA而怒发冲冠,神力外溢,遂有K条膴蠁边灰飞烟灭.而后俟其日A50题则又令其复原.(可视为立即复原)然若有祭坛无法相互到达,Dzy之神力便会大减,于是欲知其是否连通.Input第一行N,M接下来M行x,y:表示M条膴蠁边,依次编号接下来一行Q接下来Q行:每行第一个数K

Codeforces 445B DZY Loves Chemistry(并查集)

题目链接:Codeforces 445B DZY Loves Chemistry 题目大意:有若干种化学药品,给出两两会反应的关系,现在要将药物依次放入一个容器中,容器中的化学药品可以互相反应,如果当前放入的药品能与已经在容器中的某一药品反应,那么危险值翻倍,即*2,初始值为1,求一顺序,使得为危险值最大. 解题思路:并查集求最小联通分量s,2n?s即为答案. #include <cstdio> #include <cstring> #include <iostream>

bzoj 3569: DZY Loves Chinese II

链接 3569: DZY Loves Chinese II 题目大意:给出一张\(n\)个点\(m\)条边的无向图,进行\(q\)次询问,问删掉某\(k\)条边后图是否联通,强制在线. \(N≤100000 \ M≤500000\ Q≤50000\ 1≤K≤15\) 先考虑一下离线怎么做: \(cdq\)分治. 首先把所有没有影响的边都建出来 分治过程: 1.把左边没有右边有的边建出来 2.分治左边 3.把并查集恢复至初始的样子 4.把右边没有左边有的边建出来 5.分治右边 虽然每次\(cdq\

UOJ_14_【UER #1】DZY Loves Graph_并查集

题面:http://uoj.ac/problem/14 考虑只有前两个操作怎么做. 每次删除一定是从后往前删,并且被删的边如果不是树边则没有影响,如果是树边也不存在边能替代. 直接删除这条边就可以. 于是用一个栈来保存现场,然后按秩合并的并查集维护就OK了. 现在有撤回操作,但根据上面对删边分析出的性质. 可以这样: 如果是插入一条边,然后撤回,相当于删边. 如果删边然后撤回,相当于什么也不做. 代码还是很好理解的. 代码: #include <cstdio> #include <cst

BZOJ 3569 DZY Loves Chinese II 高斯消元

题目大意:给定一个[魞歄连通图],多次询问当图中某k条边消失时这个图是否联通 强制在线 我们找到这个图的任意一棵生成树 然后对于每条非树边将其的权值赋为一个随机数 对于每条树边 我们将这条树边的权值设为所有覆盖这条树边的边权的异或和 那么图不连通当且仅当删除一条树边和覆盖这条树边的所有边集 而由于刚才的处理一条树边和覆盖这条边的所有边集的异或和为零 于是问题转化成了对于给定的k条边是否存在一个边权的异或和为零的子集 果断高斯消元 由于使用了随机化所以碰撞率极低 好方法学习了...构思真是巧妙 记

bzoj 3569 DZY Loves Chinese II 随机算法 树上倍增

题意:给你一个n个点m条边的图,有若干组询问,每次询问会选择图中的一些边删除,删除之后问此图是否联通?询问之间相互独立.此题强制在线. 思路:首先对于这张图随便求一颗生成树,对于每一条非树边,随机一个权值.树边的权值为所有覆盖这条树边的非树边的权值异或和.覆盖是指这条边是个返祖边,并且一端在父节点方向,一端在子节点方向.这样,我们选出若干条边,看一下他们异或起来是不是0,如果是0,那么相当于把一条树边和它的所有子节点方向的返祖边全部断开,那么图就不连通了. 代码: #include <bits/

BZOJ 3562: [SHOI2014]神奇化合物 并查集+dfs

点击打开链接 注意到20w条边,但是询问只有1w,所以有很多边是从头到尾不变的. 首先离线处理,将从未删除的边缩点,缩点后的图的点数不会超过2w,对于每一次add或者delete,直接dfs看是否能从a走到b,然后维护一个ans. 数据不强,不然这种复杂度起码要跑10s.. #include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> using namespace st