提交时间:2021-12-08 13:32:19
运行 ID: 33833
#include<cstdio> #include<set> using namespace std; struct Node { int l, r; bool operator <(const Node & b) const { return r<b.r; } } x= {0,0}; set <Node> s; int n; int a[300010]= {-1}; bool del[300010]; void Update(set<Node>::iterator & it) { x = *it; s.erase(it++); del[x.l]=1; ++x.l; while (del[x.l] && x.l<=x.r) ++x.l; if (x.r<x.l) return; if (it!=s.begin()) { set<Node>::iterator jt=it; --jt; if (a[jt->r]==a[x.l]) { Node t=*jt; s.erase(jt); t.r=x.r; s.insert(t); return; } } s.insert(x); } int main() { scanf("%d", &n); for (int i=1; i<=n; ++i) { scanf("%d", &a[i]); if (a[i]==a[i-1]) x.r=i; else { if (x.l) s.insert(x); x.l=x.r=i; } } s.insert(x); while (s.size()) { for (set<Node>::iterator it=s.begin(); it!=s.end(); ++it) printf("%d ", it->l); puts(""); for (set<Node>::iterator it=s.begin(); it!=s.end();) if ((*it).l && (*it).r) Update(it); } return 0; }