2021蓝桥杯 I.双向排序
题目:

解析
(10条消息) 蓝桥杯 I.双向排序_Jozky86的博客-CSDN博客_蓝桥杯双向排序
代码
static const int N = 100010; //vector<PII<int, int> >ord; PII<int, int> ord[N]; //++top模式,0号元素没有值 static int ans[N]; static int n, m, a, b; void solve() { cin >> n >> m; // 原数组就是1~n int top = 0; // 压缩调整次数 while(m--) { //处理order cin >> a >> b; if (!a) { //order 1 if (top && ord[top].first == 0) b = max(ord[top--].second, b); while (top >= 1 && b >= ord[top-1].second) top -= 2; ord[++top] = { 0,b }; } else if (top) { //保证前面一定有一个order 1,然后才输入order 2 if (ord[top].first == 1) b = min(ord[top--].second, b); while (top >= 1 && b <= ord[top - 1].second) top -= 2; ord[++top] = { 1,b }; } } int l = 1, r = n, v = n; for (int i = 1; i <= top; ++i) { //到top为止,避免访问已被覆盖的元素,当然也可以用vector if (ord[i].first == 0) while (r > ord[i].second && r > l)ans[r--] = v--; else while (l<ord[i].second && r > l) ans[l++] = v--; } // 对中间进行处理 if (top % 2)//最后一次排序为升序 while (l <= r)ans[l++] = v--; else //最后一次排序为降序 while (l <= r)ans[r--] = v--; for (int i = 1; i <= n; ++i)printf("%d ", ans[i]); } signed main() { solve(); return 0; }

浙公网安备 33010602011771号