Let the set of vertices be {1, 2, 3, ..., nn}. You have to consider every vertice from left to right (i.e. from vertice 2 to nn). At vertice ii, you must make one of the following two decisions:
(1) Add edges between this vertex and all the previous vertices (i.e. from vertex 1 to i−1i−1).
(2) Not add any edge between this vertex and any of the previous vertices.
In the mathematical discipline of graph theory, a matching in a graph is a set of edges without common vertices. A perfect matching is a matching that each vertice is covered by an edge in the set.
Now Little Q is interested in checking whether a ''Cool Graph'' has perfect matching. Please write a program to help him.
In each test case, there is an integer n(2≤n≤100000)n(2≤n≤100000) in the first line, denoting the number of vertices of the graph.
The following line contains n−1n−1 integers a2,a3,...,an(1≤ai≤2)a2,a3,...,an(1≤ai≤2), denoting the decision on each vertice.OutputFor each test case, output a string in the first line. If the graph has perfect matching, output ''Yes'', otherwise output ''No''.
Sample Input
3 2 1 2 2 4 1 1 2Sample Output
Yes No
No
找规律的题目,我们可以思考一下。
前面的2属于完全独立的,之后后面的1才能与他匹配。所以前面的一个2,必须由后面的一个1来对应。
如果前面没有2了,我们当前的1可以看作2,因为1无法与前面正常匹配,所以这个1与2无差距。。
注意最开始就默认有一个2了。
所以我们这样计算即可。要保证最终2的个数为0。
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<math.h> #include<queue> #include<stack> #include <vector> #include<iostream> using namespace std; int n,t,val; int main() { cin>>t; while(t--) { cin>>n; int er=1; for(int i=1;i<n;i++) { cin>>val; if(val==1) { if(er==0) { er++; } else { er--; } } else { er++; } } if(n%2!=0||er!=0) { cout<<"No"<<endl; } else { cout<<"Yes"<<endl; } } return 0; }