社区讨论

RE 求助

P3165[CQOI2014] 排序机械臂参与者 5已保存回复 10

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
10 条
当前快照
1 份
快照标识符
@mi7pnnc4
此快照首次捕获于
2025/11/21 01:34
4 个月前
此快照最后确认于
2025/11/21 01:34
4 个月前
查看原帖
那位大佬帮我搞一组数据把我的程序搞成RE谢谢
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 10001000; 
int n, a[N], pos[N];  
struct node {
  int d, siz, rnd, tag; 
  node *ch[2], *prt; 
  inline void upd() {
    int ret = 1; 
    if(ch[0]) ret += ch[0]->siz, ch[0]->prt = this; 
    if(ch[1]) ret += ch[1]->siz, ch[1]->prt = this; 
    siz = ret; 
  }
  inline void push() {
    if(!this) return ; 
    if(!tag) return ; 
    swap(ch[0], ch[1]);
    if(ch[0]) ch[0]->tag ^= 1;
    if(ch[1]) ch[1]->tag ^= 1; 
    tag = 0; return ; 
  }
}pool[N], *cur = pool, *root, *b[N];
inline node* New(int d) { 
  node *p = cur++; p->d = d, p->siz = 1, 
  p->tag = 0, p->rnd = (rand() << 15) + rand(); 
  p->ch[0] = p->ch[1] = p->prt = 0;return p; 
}
inline int siz(node *p) { return !p ? 0 : p->siz; }
inline node *merge(node *p, node *q) {
  p->push(), q->push(); 
  if(!p || !q) return p ? p : q; 
  if(p->rnd <  q->rnd) { p->push(); p->ch[1] = merge(p->ch[1], q); p->upd(); return p; }
  if(p->rnd >= q->rnd) { q->push(); q->ch[0] = merge(p, q->ch[0]); q->upd(); return q; }
  return NULL; 
}
inline void split(node *r, int k, node *&p, node *&q) {
  if(!r) { p = q = 0; return ; } r->push(); 
  if(siz(r->ch[0]) >= k) q = r, split(r->ch[0], k, p, r->ch[0]);
  else p = r, split(r->ch[1], k - siz(p->ch[0]) - 1, r->ch[1], q); r->upd(); 
}
inline int rk(node *r, int x) {
  if(r) r->push(); 
  return !r ? 0 : (r->d >= x ? rk(r->ch[0], x) : siz(r->ch[0]) + 1 + rk(r->ch[1], x)); 
}
inline void reverse(int l, int r) {
  node *p, *q, *s; 
  split(root, l - 1, p, q); split(q, r - l + 1, q, s); 
  q->tag ^= 1; root = merge(merge(p, q), s);
}
inline int getpos(node *p) { 
  int ret = 0;  p->push(); ret += siz(p->ch[0]) + 1; 
  node *q = p; while(q) q->push(), q = q->prt;  
  while(p->prt) {  if(p->prt->ch[1] == p) ret += siz(p->prt->ch[0]) + 1; p = p->prt; }
  return ret;  
}
inline void out(node *r) {
  r->push();
  if(r->ch[0]) out(r->ch[0]); 
  printf("%d ", r->d); 
  if(r->ch[1]) out(r->ch[1]); 
}
int main() {
  scanf("%d", &n);
  for(int i = 1; i <= n; i++) {
    scanf("%d", &a[i]); 
    b[i] = New(i); 
    root = merge(root, b[i]); 
    pos[a[i]] = i;  
  } sort(a + 1, a + n + 1); 
  // for(int i = 1; i <= n; i++) printf("%d\n", b[i]->d);
  for(int i = 1; i <= n; i++) {
    int ans = getpos(b[pos[a[i]]]);
    printf("%d ", ans); 
    if(i < ans) reverse(i, ans); 
     // out(root);printf("\n");
  } // out(root); 
  return 0; 
}

回复

10 条回复,欢迎继续交流。

正在加载回复...