COGS 2098. Asm.Def的病毒

★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比
时间限制:1 s   内存限制:256 MB

【题目描述】

“这就是我们最新研制的,世界上第一种可持久化动态计算机病毒,‘创世纪’。”方教授介绍道。

“哦。”主席面无表情地点点头。

“‘创世纪’无法真正杀死透明计算网络,但是可以把它变成傻子。可惜透明计算网络能轻松地辨认出病毒,所以我建议……”

“为什么不伪装呢?”Asm.Def说。

“当然不行,它比我们更懂伪装。”

“我是说,把我们的病毒伪装成杀毒软件。”

方教授震惊地盯着Asm.Def看了一会。“你是个天才。”

Asm.Def想把病毒伪装成杀毒软件,入侵透明计算网络。透明计算网络的文件结构是一棵N个节点的树,每个病毒可以入侵一条路径上的所有节点。但如果两个病毒入侵了同一个节点,由于它们伪装成了杀毒软件,就会自相残杀。Asm.Def不希望这样的情况发生,所以他需要仔细制定入侵计划。为此,他需要频繁地询问,两条路径是否经过同一个节点(即是否相交)。

【输入格式】

第一行两个整数N,Q。

接下来N-1行,每行两个整数a,b,表示(a,b)是树上的一条边。

接下来Q行,每行四个整数s1,t1,s2,t2,表示询问s1~t1的路径是否与s2~t2的路径相交。

【输出格式】

对每个询问,若相交则输出一行”YES”,否则输出一行”NO”。

【样例输入】

6 5
1 2
1 3
2 4
4 5
4 6
1 1 5 6
1 2 6 3
2 3 5 6
6 4 3 1
4 3 1 2

【样例输出】

NO
YES
NO
NO
YES

【提示】

N,Q<=1000.

1<=s1,t1,s2,t2<=N。

【来源】

在此键入。

倍增求LCA

屠龙宝刀点击就送

#include <ctype.h>
#include <cstdio>
#define M 1005

void read(int &x)
{
    x=0;
    bool f=0;
    char ch=getchar();
    while(!isdigit(ch)) {if(ch==‘-‘) f=1;ch=getchar();}
    while(isdigit(ch)) {x=x*10+ch-‘0‘;ch=getchar();}
    x=f?(~x)+1:x;
}
struct node
{
    int next,to;
    node(int next=0,int to=0) :next(next),to(to){}
}edge[M<<2];
int head[M],cnt,dad[M][25],dep[M],N,Q;
void add(int u,int v)
{
    edge[++cnt]=node(head[u],v);
    head[u]=cnt;
}
void dfs(int x)
{
    dep[x]=dep[dad[x][0]]+1;
    for(int i=0;dad[x][i];i++)
    dad[x][i+1]=dad[dad[x][i]][i];
    for(int i=head[x];i;i=edge[i].next)
    {
        if(dad[x][0]!=edge[i].to)
        {
            dad[edge[i].to][0]=x;
            dfs(edge[i].to);
        }
    }
}
int max(int a,int b) {return a>b?a:b;}
void swap(int &x,int &y)
{
    int tmp=y;
    y=x;
    x=tmp;
}
int lca(int x,int y)
{
    if(dep[x]>dep[y]) swap(x,y);
    for(int i=20;i>=0;i--)
    if(dep[dad[y][i]]>=dep[x]) y=dad[y][i];
    if(x==y) return x;
    for(int i=20;i>=0;i--)
    if(dad[x][i]!=dad[y][i]) x=dad[x][i],y=dad[y][i];
    return dad[x][0];
}
int main()
{
    freopen("asm_virus.in","r",stdin);
    freopen("asm_virus.out","w",stdout);
    read(N);
    read(Q);
    for(int x,y,i=1;i<N;i++)
    {
        read(x);
        read(y);
        add(x,y);
        add(y,x);
    }
    dfs(1);
    for(int a,b,c,d;Q--;)
    {
        read(a);read(b);
        read(c);read(d);
        int maxn=0;
        maxn=max(lca(a,b),lca(c,d));
        if(lca(a,c)>=maxn||lca(a,d)>=maxn||lca(b,c)>=maxn||lca(b,d)>=maxn) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
时间: 2024-10-13 23:43:10

COGS 2098. Asm.Def的病毒的相关文章

COGS——C2098. Asm.Def的病毒

http://www.cogs.pro/cogs/problem/problem.php?pid=2098 ★☆   输入文件:asm_virus.in   输出文件:asm_virus.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “这就是我们最新研制的,世界上第一种可持久化动态计算机病毒,‘创世纪’.”方教授介绍道. “哦.”主席面无表情地点点头. “‘创世纪’无法真正杀死透明计算网络,但是可以把它变成傻子.可惜透明计算网络能轻松地辨认出病毒,所以我建议……

COGS——T2084. Asm.Def的基本算法

★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] “有句美国俗语说,如果走起来像鸭子,叫起来像鸭子,那就是一只鸭子.”斯科特·华莱士看着Asm.Def面前屏幕上滚动的绿色字符,若有所思地说. “什么意思?” “你的数据.看上去是一棵树.” “按照保密条令,我什么也不说这是最好的——但见你这么热情,一句话不说也不好.”Asm.Def停下手中的快速数论变换,“确实是树.” “然后你怎么算出来目标

COGS2085 Asm.Def的一秒

时间限制:1 s   内存限制:256 MB [题目描述] “你们搞的这个导弹啊,excited!” Asm.Def通过数据链发送了算出的疑似目标位置,几分钟后,成群结队的巡航导弹从“无蛤”号头顶掠过,布满了天空. “一共发射了多少导弹?” “十亿美元.”斯科特·华莱士回答,“单价100万,现在天上有1000多枚.这玩意能自动搜索10个可疑点,找到目标就发动攻击.” “什么?10个?我给了它10万个点!” “这会让它的程序崩溃的.好在你还有时间手动输入路径.” “多久?” “零……还有一秒,他们

2084. Asm.Def的基本算法

2084. Asm.Def的基本算法 传送门 ★☆   输入文件:asm_algo.in   输出文件:asm_algo.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] "有句美国俗语说,如果走起来像鸭子,叫起来像鸭子,那就是一只鸭子."斯科特·华莱士看着Asm.Def面前屏幕上滚动的绿色字符,若有所思地说. "什么意思?" "你的数据.看上去是一棵树." "按照保密条令,我什么也不说这是最好的--但见你

cogs 1695. 梦游仙境

★☆   输入文件:XTTMYXJ.in   输出文件:XTTMYXJ.out   简单对比 时间限制:5 s   内存限制:512 MB [题目描述] 在Asm.def仍然在与人工智能进行艰苦的斗争时,雪甜甜小公主仍然在亚特兰蒂斯里自娱自乐,她不小心误闯了玛丽奥的世界. 她感觉十分有趣,她闯关到了一行有n个小块上面有傻币的地面(可以看成一个数轴),地面上有许多,假如雪甜甜的起点为l,终点为r,跳跃能力为jump,从左往右跳 针对雪甜甜皇家公主给出的q组询问l,r,jump,你需要计算他获得的傻

ACM/CF赛制getstart模板

(包含整型变量快速读入.简易循环和连续容器的迭代器循环的宏定义.调试时的运行时间输出(编译选项应有“DEBUG”宏定义)等) 1 /*=============================================================================================================================*/  2 /*==================================================

[BZOJ1003](ZJOI 2006) 物流运输trans

[题目描述] 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪.由于各种因素的存在,有的时候某个码头会无法装卸货物.这时候就必须修改运输路线,让货物能够按时到达目的地.但是修改路线是一件十分麻烦的事情,会带来额外的成本.因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小. [输入格式] 第一行是四个整数n(1<=n<=100).m(1<=

【Codeforces 949D】Shake It! 【动态规划】

参考: http://blog.csdn.net/gjghfd/article/details/77824901 所求的是满足条件的图中"不同构"的数量,意味着操作的顺序是可以忽略的.考虑若干次操作后得到的一个"World" G,其中某次操作(s(G), t(G))生成的节点为w,则由s(G)到w和由w到t(G)的所有路径及途径点生成的两个子图分别符合"World"的定义. 这意味着我们可以将一个"World"分割成若干个子问

NOIP模拟&#183;20141105题解

[A.韩信点兵] 结论题+模板题,用到了中国剩余定理,维基百科上讲的就比较详细,这里就不再赘述了…… 对于这题,我们先利用中国剩余定理($x \equiv \sum{a_i \times m_i (m_i^{-1} \mod p_i)}\, \mod (\prod{p_i})$)找到当前人数的最小可行解$x_0$,(如果$x_0$已经超过了$N$,直接输出无解即可)这时不难证明,对于任何一个可行解,都有 $$x_i = x_0 + k \times \prod{P_i},k \in \mathb