键盘侠牧师
你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。

原题链接:http://codeforces.com/problemset/problem/320/B

之前自己做的时候一直读不懂题意,看了大佬的博客才知道是用dfs写,一道暴力搜索大水题https://www.cnblogs.com/windysai/p/3531473.html

题目意思:有两种操作:"1 x y"  (x < y) 和 "2 a b" (a ≠ b) 。 问对于的"2 a b" 询问,能否从第a行的区间到达第b行的区间(行的数量是以:"1 x y" 来统计的,不包括"2 a b"这些行),当然可以直达,也可以借助某些区间间接到达。假设给定一个区间为 (a, b) ,能到达区间 (c, d) 的条件需要满足 c < a < d 或者c < b < d 。以题目中的数据为例,

5

1 1 5
1 5 11
2 1 2
1 2 9
2 1 2


     对于第3行的 2  1  2,即问从第1行:1  1  5 是否可以到达第2行的 1  5  11,这明显是不能的,因为 5 < 1 < 11 和 5 < 5 < 11 都不满足。而第5行的 2  1  2 则是可以的,因为可以借助1  2  9 这个桥梁:(1  5) ——> (2  9) ——> (5  11)。理由是 2 < 5  < 9 和  5 < 9 < 11。

 

 

#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>

using namespace std;
int n;
typedef pair<long long ,long long> PII;
PII p[110];
int cun=0;

int v[110];
bool check(int x,int y)
{
      return((p[x].first < p[y].second && p[x].first > p[y].first) || (p[x].second < p[y].second && p[x].second > p[y].first));
}
void dfs(int x)
{
    if(v[x])return;
    v[x]=1;
    for(int i=0;i<cun;i++)
    {
        if(check(x,i))
        {
            dfs(i);
        }
    }
    return ;
}
int main()
{
    cin >> n;
    while(n--)
    {
        int a,b,c;
        cin >> a >> b >>c;
        if(a==1)
        {
            p[cun].first = b;
            p[cun].second=c;
            cun++;
        }
        else if(a==2)
        {
            memset(v,0,sizeof(v));
            dfs(b-1);
            if(v[c-1])
            {
                cout <<"YES"<<endl;
            }
            else
            {
                cout <<"NO"<<endl;
            }
        }

    }
    return 0;
}

 你的脸上风淡云轻,谁也不知道你的牙咬得有多紧。你走路带着风,谁也不知道你膝盖上仍有曾摔过的伤的淤青。你笑得没心没肺,没人知道你哭起来只能无声落泪。要让人觉得毫不费力,只能背后极其努力。我们没有改变不了的未来,只有不想改变的过去。

posted on 2019-08-22 11:23  键盘侠牧师  阅读(442)  评论(0编辑  收藏  举报