time limit per test 2 seconds
memory limit per test 256 megabytes
题目链接http://codeforces.com/problemset/problem/1169/B
题目大意:给你n对数,问你是否能找到一对x,y使得每一对的数至少有一个数等于x或y。
对于这个问题我们可以直接暴力就好了,我们假设第一对数的左边为x,然后往下找,当某对数两边都不为x时我们假设该对数的左边为y,然后接着往下找,当某对数的两边既不等于x也不等于y时,则结束。
这是第一种情况,接下来是第二种情况:设第一对数的右边为x,然后过程和第一种一样。
第三种:设第一对数的左边为x,然后找,再假设第一个不满足x的对数的右边为y然后继续。
第四种:右边x,右边y。
以下是AC代码:
#include <bits/stdc++.h>
using namespace std;
const int mac=3e5+10;
struct node
{
int l,r;
bool friend operator <(node a,node b){
return a.l<b.l;
}
}a[mac];
int main()
{
int n,m;
cin>>n>>m;
int len=9999999,mark=0;
for (int i=1; i<=m; i++){
scanf ("%d%d",&a[i].l,&a[i].r);
}
sort(a+1,a+1+m);
int x=a[1].l,y=0,i;
for (i=2; i<=m; i++){
if (y && a[i].l!=y && a[i].r!=y && a[i].l!=x && a[i].r!=x) break;
if (a[i].l!=x && a[i].r!=x) y=a[i].l;
}
if (i>m) {
printf ("YES\n");return 0;
}
x=a[1].r,y=0;
for (i=2; i<=m; i++){
if (y && a[i].l!=y && a[i].r!=y && a[i].l!=x && a[i].r!=x) break;
if (a[i].l!=x && a[i].r!=x) y=a[i].l;
}
if (i>m) {
printf ("YES\n");return 0;
}
x=a[1].l,y=0;
for (i=2; i<=m; i++){
if (y && a[i].l!=y && a[i].r!=y && a[i].l!=x && a[i].r!=x) break;
if (a[i].l!=x && a[i].r!=x) y=a[i].r;
}
if (i>m) {
printf ("YES\n");return 0;
}
x=a[1].r,y=0;
for (i=2; i<=m; i++){
if (y && a[i].l!=y && a[i].r!=y && a[i].l!=x && a[i].r!=x) break;
if (a[i].l!=x && a[i].r!=x) y=a[i].r;
}
if (i>m) {
printf ("YES\n");return 0;
}
printf ("NO\n");
return 0;
}