codeforces 320B Ping-Pong (Easy Version)

题目传送门

题意

给你一系列区间,题意规定两个区间(a,b)到(c,d)有路径的条件是 c < a < d or c < b < d.
然后在给出一系列的区间中插入问题,问两个区间是否相通。

解题思路

开始一看以为可以利用区间相交后传递相交关系,就想着用数组模拟一个类似并查集的前驱表,每给出一个遍历一遍。结果wa。 后来听ac的同学说利用dfs来做。然后一切水到渠成。

#include <bits/stdc++.h>

using namespace std;
const int maxn = 105;
struct node
{
    int a,b, id;
    node(int aa = 0, int  bb = 0, int idd = 0) : a(aa), b(bb), id(idd) {}
} data[maxn];

int sum = 1;
int visit[maxn]= {0};

bool check(int a, int b)
{
    if((data[a].a > data[b].a && data[a].a<data[b].b) || (data[a].b > data[b].a && data[a].b < data[b].b))
        return true;
    return false;
}

void dfs(int s)
{
    memset(visit, 0, sizeof(visit));
    queue<int> q;
    q.push(s);
    int p;
    while(!q.empty())
    {
        p = q.front();
        q.pop();
        for(int i = 1; i < sum; i++)
        {
            if(!visit[i])
                if(check(p,i))
                    q.push(i),visit[i] = 1;
        }
    }
}

int main()
{
    int n;
    scanf("%d", &n);
    int t,a,b;
    while(n--)
    {
        scanf("%d%d%d", &t,&a,&b);
        if(t==1)
        {
            data[sum++] = node(a,b);
        }
        else
        {
            dfs(a);
            if(visit[b])
                puts("YES");
            else puts("NO");
        }


    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值