UVa10410代码

这里就不加太多的注释了,想一想就能明白代码的目的

// UVa 10410 
#include <iostream> 
#include <cstdio>
#include <cstring>
#include <vector> 
#include <stack> 
using namespace std;

const int maxn = 1000 + 5;

vector<int> node[maxn];
int pos[maxn]; 

int main() {
  int N, m;
  while (scanf("%d", &N) == 1) {
    for (int i = 1; i <= N; ++i)
      node[i].clear();
    for (int i = 1; i <= N; ++i) { // bfs
      scanf("%d", &m);
      pos[m] = i;    
    }
    stack<int> st;
    int b; 
    scanf("%d", &b);
    st.push(b);
    for (int i = 1; i < N; ++i) { // dfs 
      scanf("%d", &b);
      while (1) {
        int a = st.top();
        if (pos[a]+1 < pos[b] || (pos[a]+1 == pos[b] && a > b) || pos[a] == 1) {
          node[a].push_back(b);
          st.push(b);     
          break; 
        }
        else 
          st.pop();
      }
    }
    for (int i = 1; i <= N; ++i) {
      printf("%d:", i); 
      for (int j = 0; j < node[i].size(); ++j)
        printf(" %d", node[i][j]);
      printf("\n"); 
    }
  }
  return 0;
}

 

posted @ 2019-06-04 18:34  yifei_Wa  阅读(229)  评论(0编辑  收藏  举报