利用栈可以巧妙的解决该问题。

   之所以可以用栈可以解决,关键在于想通就算是第1个和第N个是配对,一直删除配对下去,也是会在队列的中间就有个配对的,所以栈的使用并不会和排队排成圈这一特性有冲突。应该想通即使出现第1个和第N个配对这样的特例,也是可以从中间向两边散开消除,到最后栈还是会出现空的情况。


   一开始忘了STL里面有栈,使用数组去模拟栈(数组模拟栈的要点在于存储栈顶所在的索引位置)。如下:

// 虽然可以用下面的方法模拟栈,但很明显不如直接用stack<int>
#include <iostream>
using  namespace std;
int main() {
    int a[200001], b[200000], N, m, w;
    cin >> N;
    while ( N != 0) {
        int i;
        for ( i = 0; i < N; i++ ) {
            cin >> m >> w;
            a[m] = w;
            a[w] = m;
        }
        int pointer = 0;
        b[0] = 1;
        for ( i = 1; i <= 2*N; i++ ) {
            if(pointer == -1) {
                b[0] = a[i];
            }
            else {
                if( a[i] == b[pointer] ) {
                    pointer--;
                }else {
                    pointer++;
                    b[pointer] = i;
                }
            }
        }
        if(pointer == 0)
            cout << "Yes\n";
        else
            cout << "No\n";
        cin >> N;
    }
}


   看了习题讲解的PPT后发现有现成的STL可以用,所以果断换了STL,也顺利通过:

#include <iostream>
#include<stack>
using  namespace std;
int main() {
    int a[200001], b[200000], N, m, w;
    cin >> N;
    while ( N != 0) {
        int i;
        for ( i = 0; i < N; i++ ) {
            cin >> m >> w;
            a[m] = w;
            a[w] = m;
        }
        stack<int> s;
        for (int i=1;i<=2*N;i++) {
            if (!s.empty()&&s.top()==a[i])
                s.pop();
            else
                s.push(i);
        }
        if(s.empty())
            cout << "Yes\n";
        else
            cout << "No\n";
        cin >> N;
    }
}