题目链接:
https://codeforces.com/contest/1169/problem/B
题目大意:
给你m个点对,然后问你能不能找到两个不同的值,使得每个每个点对在都至少含有这两个点对中的一个。
具体思路:
md读错题了,还以为是区间。。对于这个题意,我们枚举第一个点对中的两个值,判断剩余的点对中不包含这个第一个点对的两个值的有多少个,如果有0个的话,就说明这些点对至少有一个相等了,所以就肯定输出YES.如果不是的话,我们就判断剩余的点对中出现次数最多的为多少次,如果数总的对数中不包含x的第一个值的个数,那么也是yes。对于第一个点对的第二个用同样的方法处理。
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 # define ll long long
4 const int maxn = 3e5+100;
5 int tonx[maxn],tony[maxn];
6 struct node
7 {
8 int st,ed;
9 } q[maxn];
10 vector<int>sto;
11 int main()
12 {
13 int n,m;
14 scanf("%d %d",&n,&m);
15 int st,ed;
16 for(int i=1; i<=m; i++)
17 {
18 scanf("%d %d",&q[i].st,&q[i].ed);
19 }
20 int flag=0;
21 for(int i=2; i<=m; i++)
22 {
23 if(q[i].st==q[1].st||q[i].ed==q[1].st)
24 continue;
25 sto.push_back(i);
26 }
27 int len=sto.size();
28 for(int i=0; i<len; i++)
29 {
30 tonx[q[sto[i]].st]++;
31 tonx[q[sto[i]].ed]++;
32 if(tonx[q[sto[i]].st]==len||tonx[q[sto[i]].ed]==len)
33 flag=1;
34 }
35 if(len==0)
36 flag=1;
37 sto.clear();
38 for(int i=2; i<=m; i++)
39 {
40 if(q[i].st==q[1].ed||q[i].ed==q[1].ed)
41 continue;
42 sto.push_back(i);
43 }
44 len=sto.size();
45 for(int i=0; i<len; i++)
46 {
47 //cout<<q[sto[i]].st<<" "<<q[sto[i]].ed<<endl;
48 tony[q[sto[i]].st]++;
49 tony[q[sto[i]].ed]++;
50 if(tony[q[sto[i]].st]==len||tony[q[sto[i]].ed]==len)
51 flag=1;
52 }
53 if(len==0)
54 flag=1;
55 if(flag)
56 printf("YES
");
57 else
58 printf("NO
");
59 return 0;
60 }