B. Pairs(思维)

题目链接:

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 }
原文地址:https://www.cnblogs.com/letlifestop/p/10961196.html