hackerrank [Week of Code 33] Bonnie and Clyde

任意门

题意:给一个图,每次询问给三个点a,b,c,问是否存在一条从a到c,一条b到c的路径除c外无交点。

双连通分量缩点建出圆方树是必须的,然后我们需要判断c是否在a到b的路径上,或者c的某个相邻的方点(新建的节点)在a到b的路径上。最后这玩意判了很久就是一直不对,去膜了ccz代码……哦,lca(a,b),lca(a,c),lca(b,c)只有俩不同取值,异或一下就得到多余的一个,然后就很好判了。

#include<cstdio>
#include<algorithm>
#define MN 3100001
using namespace std;

int read_p,read_ca;
inline int read(){
    read_p=0;read_ca=getchar();
    while (read_ca<‘0‘||read_ca>‘9‘) read_ca=getchar();
    while (read_ca>=‘0‘&&read_ca<=‘9‘) read_p=read_p*10+read_ca-48,read_ca=getchar();
    return read_p;
}
struct na{int y,ne;}b[MN<<1],B[MN<<1];
int n,m,q,l[MN],num=0,fa[MN],lo[MN],df[MN],F[MN][20],de[MN],x,y,z,nm=0,st[MN],top=0,SSS=0,L[MN],NUM=0,ID=0;
inline int min(int a,int b){return a<b?a:b;}
inline void in(int x,int y){b[++num].y=y;b[num].ne=l[x];l[x]=num;}
inline void IN(int x,int y){B[++NUM].y=y;B[NUM].ne=L[x];L[x]=NUM;}
void dfs(int x,int f){
    fa[x]=ID;
    df[x]=lo[x]=++nm;
    for (int i=l[x];i;i=b[i].ne)
    if (b[i].y!=f){
        if (!df[b[i].y]){
            st[++top]=b[i].y;
            dfs(b[i].y,x);
            lo[x]=min(lo[x],lo[b[i].y]);
            if (lo[b[i].y]==df[x]) for (++SSS,IN(x,SSS);top&&df[st[top]]>=df[b[i].y];top--) IN(SSS,st[top]);
            else if (lo[b[i].y]>df[x]) IN(x,b[i].y),top--;
        }else lo[x]=min(lo[x],df[b[i].y]);
    }
}
void work(int x){
    df[x]=0;
    for (int i=1;i<20;i++) F[x][i]=F[F[x][i-1]][i-1];
    for (int i=L[x];i;i=B[i].ne) de[B[i].y]=de[x]+1,F[B[i].y][0]=x,work(B[i].y);
}
inline int lca(int x,int y){
    if (de[x]>de[y]) swap(x,y);
    for (int i=19;i>=0;i--)
    if (de[F[y][i]]>=de[x]) y=F[y][i];
    if (x==y) return x;
    for (int i=19;i>=0;i--)
    if (F[x][i]!=F[y][i]) x=F[x][i],y=F[y][i];
    return F[x][0];
}
int main(){
    n=read();m=read();q=read();SSS=n;
    for (int i=1;i<=m;i++) x=read(),y=read(),in(x,y),in(y,x);
    for (int i=1;i<=n;i++) if (!df[i]) ++ID,dfs(i,0);
    for (int i=1;i<=n;i++) if (df[i]) de[i]=1,work(i);
    while(q--){
        x=read();y=read();z=read();
        if (fa[x]!=fa[z]||fa[y]!=fa[z])puts("NO");else
        m=lca(x,y)^lca(y,z)^lca(x,z),puts(((m>n&&(m==F[z][0]||F[m][0]==z))||m==z)?"YES":"NO");
    }
}

时间: 2024-10-14 01:00:37

hackerrank [Week of Code 33] Bonnie and Clyde的相关文章

【HackerRank Week of Code 31】Colliding Circles

https://www.hackerrank.com/contests/w31/challenges/colliding-circles/problem 设E(n)为序列长度为n时的期望值. \[ \begin{aligned} E(n-1)=&E(n)+\frac1{n\choose2}\sum_{0\leq i<j\leq n}2r_ir_j\=&E(n)+\frac1{n\choose2}\left[\left(\sum r_i\right)^2-\sum r_i^2\righ

【枚举约数】HackerRank - Week of Code 26 - Satisfactory Pairs

题意:给你一个正整数n,问你存在多少个正整数对a,b(a<b),满足条件:存在正整数x,y,使得ax+by=n. 就预处理出n以内所有数的约数,然后暴力枚举a,暴力枚举x,然后枚举n-ax的所有约数,判重,统计答案即可. #include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef vector<int>::iterator ITER; vector

hackerrank Week of Code 34 Same Occurrence

之前也想到了利用前缀数组,记录每一位的0~i的值,但是这样效率并不高. 题解的方法是每出现一次这个数字,记录一下下标,然后通过求区间的交,这样优化就不会超时了. #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<algorithm> #include<iostream> #include<queue> #includ

Hackerrank: Week of Code 36

Cut a Strip 题目简述:给定$n \times m$的矩阵$a[][]$,要求选择一个$x \times 1(1 \leq x \leq k)$的(连续)子矩阵并清零后,找到最大和的(连续)子矩阵. 数据范围:$1 \leq n, m, k \leq 380$. 题解: 子矩阵可以用四个参数表示$(x_1, y_1, x_2, y_2)$,其中$(x_1, y_1)$是其左上角,$(x_2, y_2)$是其右上角. 我们枚举子矩阵的$y_1$和$y_2(1 \leq y_1 \leq

霍夫曼编码(Huffman Code) 简单模拟

这周的数据结构实验作业,刚好被抽到号要上交,于是乎在宿舍写了一晚上. 若有错漏之处请斧正! 关于建树的参考博文:http://blog.csdn.net/xgf415/article/details/52628073 实验要求如下: 编译器:VS 2015 运行环境: WIN 10 代码如下: hfmTree.h 1 #include <string> 2 #include "MinHeap.h" 3 #include <stack> 4 #include &l

你一生不可不看的奥斯卡获奖电影(1届~81届全)

<贫民窟的百万富翁>(Slumdog Millionaire) 提名: <本杰明·巴顿奇事>(The Curious Case of Benjamin Button),派拉蒙 <福斯特对话尼克松>(Frost/Nixon),环球 <米尔克>(Milk),焦点 <朗读者>(The Reader),韦恩斯坦 2008(80届) 获奖 <老无所依>No Country for Old Men 提名 <赎罪>Atonement &

历年奥斯卡获奖影片(1927—2014)

1939年出品的"Gone with the Wind 乱世佳人 ",好精彩好经典啊!历史的评价一致公认,这部影片是"好莱坞第一巨片".反映"宏大战争中永恒的爱情",是一幅反映社会政治.经济.道德诸多方面的巨大而深刻变化的历史画卷.这部依据玛格丽特·米切尔的畅销小说<飘>改编而成的电影,使费雯丽轰动了全美国和整个大洋彼岸."郝思嘉风暴"经久不息.自1939后的几十年,看过这部影片的观众已数以亿计.影片当之无愧地获得

Flipped

More praise for FLIPPED "We flipped over this fantastic book, its gutsy girl Juli and its wise, wonderful ending." --The Chicago Tribune "Delightful! Delicious! And totally teen." --BookPage * "With a charismatic leading lady kids

全球100部最佳影片排行

全球100部最佳影片排行 以下是IMDB(美国著名影评网站)网民评出全球100部最佳影片 :  1. <教父>The Godfather 1972年 8.9 分  科波拉黑帮经典<教父>的首部,派拉蒙公司最成功的影片之一,坐稳IMDB头把交椅应属,众望所归.虽然评论界一致对<教父>系列的第2集推崇有佳,但大多数影迷似乎还是对<教父>情有独钟,这可能与马龙·白兰度极具个力的表演有关,直到今天他那种含 糊沙哑的声音与神秘莫测的表情都依然叫人着迷.  2. <