链表做法70ptsTLE求条
查看原帖
链表做法70ptsTLE求条
921267
oymz楼主2024/7/14 21:12
#include<bits/stdc++.h>

using namespace std;

const int N = 1e5 + 5, H = 0, T = 1e5 + 1;

struct Node {
  int f, l, r, len, nxt, pre;
};

int n, m;
int s[N], x[N];
Node f[N];

void Print(){
  for(int i = f[H].nxt; i != T; i = f[i].nxt){
    cout << f[i].f << ' ' << f[i].l << ' ' << f[i].len << '\n';
  }
}

int main(){
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  //freopen("P7912_8.in", "r", stdin);
  //freopen("P7912.out", "w", stdout);
  cin >> n;
  x[0] = -1;
  for(int i = 1; i <= n; i++){
    cin >> x[i];
    s[i - 1] = i;
    if(x[i] != x[i - 1]){
      f[++m] = {x[i], i};
      f[m - 1].nxt = m, f[m].pre = m - 1;
    }
    f[m].len = i - f[m].l + 1, f[m].r = i;
  }
  f[m].nxt = T;
  f[T].pre = m;
  while(m){
    for(int i = f[H].nxt; i != T; i = f[i].nxt){
      cout << f[i].l << ' ';
      f[i].l = s[f[i].l], f[i].len--;
      if(!f[i].len){
        f[f[i].pre].nxt = f[i].nxt;
        f[f[i].nxt].pre = f[i].pre;
        m--;
      }
    }
    cout << '\n';
    for(int i = f[T].pre; f[i].pre != H; i = f[i].pre){
      if(f[i].f == f[f[i].pre].f){
        f[f[i].pre].len += f[i].len;
        s[f[f[i].pre].r] = f[i].l;
        f[f[i].pre].r = f[i].r;

        f[f[i].pre].nxt = f[i].nxt;
        f[f[i].nxt].pre = f[i].pre;
        m--;
      }
    }
  }
  return 0;
}

2024/7/14 21:12
加载中...