题目地址:http://codeforces.com/problemset/problem/320/B
题意:
定义一个线段能够到达另一线段的条件是:这个线段的头或尾要在后面这个线段的中间
或者a能到b,b能到c,那么a也能到c
现给你n个操作,插入一个线段,或者问你a能否到b
解题思路:
根据题目给的条件建图然后询问的话用搜索。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int maxn = 110;
bool map[maxn][maxn];
int n;
struct node
{
int a,b;
}line[maxn];
bool vis[maxn];
int cnt;
bool bfs(int a,int b)
{
queue<int> q;
memset(vis,false,sizeof(vis));
for(int i=1;i<cnt;i++)
{
if(i==a)
continue;
if(map[a][i])
{
q.push(i);
vis[i]=true;
}
}
vis[a]=true;
while(!q.empty())
{
int tmp=q.front();
q.pop();
if(tmp==b)
return true;
for(int i=1;i<cnt;i++)
{
if(map[tmp][i] && !vis[i])
{
q.push(i);
vis[i]=true;
}
}
}
return false;
}
bool judge(int a,int b)
{
if((line[a].a>line[b].a && line[a].a<line[b].b) || (line[a].b>line[b].a && line[a].b<line[b].b))
return true;
return false;
}
int main()
{
while(~scanf("%d",&n))
{
int o,x,y;
cnt=1;
memset(map,false,sizeof(map));
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&o,&x,&y);
if(o==1)
{
line[cnt].a=x;
line[cnt].b=y;
cnt++;
for(int i=1;i<cnt;i++)
{
if(judge(i,cnt-1))
map[i][cnt-1]=true;
if(judge(cnt-1,i))
map[cnt-1][i]=true;
}
}
else
{
if(bfs(x,y))
printf("YES\n");
else
printf("NO\n");
}
}
}
return 0;
}