B. Pairs---快速暴力解法---Codeforces Round #562 (Div. 2)

Pairs

time limit per test 2 seconds
memory limit per test 256 megabytes

题目链接http://codeforces.com/problemset/problem/1169/B

B. Pairs---快速暴力解法---Codeforces Round #562 (Div. 2)
B. Pairs---快速暴力解法---Codeforces Round #562 (Div. 2)
B. Pairs---快速暴力解法---Codeforces Round #562 (Div. 2)


题目大意:给你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;
}
上一篇:项目实训 No.15


下一篇:PHP imagick安装与配置