您的位置:首页 > 其它

codeforces B. Ping-Pong (Easy Version) 解题报告

2014-01-23 17:06 351 查看
题目链接:http://codeforces.com/problemset/problem/320/B

题目意思:有两种操作:"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。

其实这条题目的解决方法是搜索,以下用dfs来解决

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;

const int maxn = 100 + 10;
int a[maxn], b[maxn], ans[maxn];
int n;

void dfs(int k)
{
int i;
ans[k] = 1;   // 可以到达第k行的区间
for (i = 1; i <= n; i++)
{
if (a[k] > a[i] && a[k] < b[i] && !ans[i])  // !ans[i]的使用防止下一次又重复访问第 i 行的区间,致使不停的无限循环
dfs(i);
else if (b[k] > a[i] && b[k] < b[i] && !ans[i])
dfs(i);
}
}

int main()
{
int i, t1, t2, choice, len;
while (scanf("%d", &len) != EOF)
{
n = 0;
for (i = 1; i <= len; i++)
{
memset(ans, 0, sizeof(ans));  // 这个很重要,每次询问都要清空,询问之间是互相独立的
scanf("%d", &choice);
if (choice == 1)
{
n++;
scanf("%d%d", &a
, &b
);
}
else if (choice == 2)
{
scanf("%d%d", &t1, &t2);
dfs(t1);
if (ans[t2])  // 如果可以到达第t2行的区间
puts("YES");
else
puts("NO");
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: