最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

指数序列——精选推荐

IT圈 admin 32浏览 0评论

2024年5月23日发(作者:欧昭懿)

}

int newnode(int val) {

cnt++;

t[cnt].val = val;

t[cnt].rnd = rand();

t[cnt].cnt = 1;

t[cnt].size = 1;

return cnt;

}

void build() {

root = newnode(-0x7fffffff);

t[root].son[1] = newnode(0x7fffffff);

upd(root);

}

void insert(int &x, int val) {

if(!x) {

x = newnode(val);

return ;

}

t[x].size++;

if(t[x].val == val)t[x].cnt++;

else {

int d = t[x].val < val;

insert(t[x].son[d], val);

if(t[x].rnd > t[t[x].son[d]].rnd) rotate(x, d);

}

}

void del(int &x, int val) {

if(!x) return ;

if(t[x].val == val) {

if(t[x].cnt > 1) {

t[x].cnt--;

t[x].size--;

return ;

}

if(!t[x].son[0] || !t[x].son[1]) {

x = t[x].son[1] + t[x].son[0];

} else {

int d = t[t[x].son[0]].rnd > t[t[x].son[1]].rnd;

rotate(x, d);

del(x, val);

}

} else {

t[x].size--;

int d = t[x].val < val;

del(t[x].son[d], val);

}

}

int rank(int x, int val) {

if(!x) return 0;

if(t[x].val == val) return t[t[x].son[0]].size + 1;

if(t[x].val > val) {

return rank(t[x].son[0], val);

} else {

return rank(t[x].son[1], val) + t[t[x].son[0]].size + t[x].cnt;

}

}

int kth(int x, int rnk) {

if(!x) return 0x7fffffff;

if(rnk <= t[t[x].son[0]].size) {

return kth(t[x].son[0], rnk);

} else {

if(rnk <= t[t[x].son[0]].size + t[x].cnt) {

return t[x].val;

} else {

return kth(t[x].son[1], rnk - t[x].cnt - t[t[x].son[0]].size);

}

}

}

int pre(int x, int val) {

if(!x) return -0x7fffffff;

if(t[x].val >= val) {

return pre(t[x].son[0], val);

} else {

return max(pre(t[x].son[1], val), t[x].val);

}

}

int nxt(int x, int val) {

if(!x) return 0x7fffffff;

if(t[x].val <= val) {

return nxt(t[x].son[1], val);

} else {

return min(nxt(t[x].son[0], val), t[x].val);

}

}

int flag = 0, change[10010], c[10010];

void order(int x) {

if(!x) return ;

if(t[x].cnt > 1) {

change[++flag] = t[x].val;

c[flag] = t[x].cnt;

t[x].cnt = 1;

}

order(t[x].son[0]);

order(t[x].son[1]);

}

void update() {

for(int i = 1; i <= flag; i++) {

if(c[i] % 2 == 0) {

del(root, change[i]);

}

for(int j = 0; j < c[i] / 2; j++) {

insert(root, change[i] + 1);

}

}

}

void order1(int x) {

if(!x) return;

order1(t[x].son[0]);

c[++flag] = t[x].val;

order1(t[x].son[1]);

}

int main() {

int n;

cin >> n;

build();

srand(time(NULL));

for(int i = 1; i <= n; i++) {

int data; cin >> data;

insert(root, data);

}

while(1) {

flag = 0;

order(root);

if(!flag) break;

update();

}

flag = -1;

memset(c, 0, sizeof(c));

order1(root);

c[0] = -1;

int ans = 0;

for(int i = 1; i < flag; i++) {

// cout << c[i] << endl;

ans += c[i] - c[i - 1] - 1;

}

cout << ans << endl;

return 0;

}

Loading [MathJax]/jax/output/HTML-CSS/

2024年5月23日发(作者:欧昭懿)

}

int newnode(int val) {

cnt++;

t[cnt].val = val;

t[cnt].rnd = rand();

t[cnt].cnt = 1;

t[cnt].size = 1;

return cnt;

}

void build() {

root = newnode(-0x7fffffff);

t[root].son[1] = newnode(0x7fffffff);

upd(root);

}

void insert(int &x, int val) {

if(!x) {

x = newnode(val);

return ;

}

t[x].size++;

if(t[x].val == val)t[x].cnt++;

else {

int d = t[x].val < val;

insert(t[x].son[d], val);

if(t[x].rnd > t[t[x].son[d]].rnd) rotate(x, d);

}

}

void del(int &x, int val) {

if(!x) return ;

if(t[x].val == val) {

if(t[x].cnt > 1) {

t[x].cnt--;

t[x].size--;

return ;

}

if(!t[x].son[0] || !t[x].son[1]) {

x = t[x].son[1] + t[x].son[0];

} else {

int d = t[t[x].son[0]].rnd > t[t[x].son[1]].rnd;

rotate(x, d);

del(x, val);

}

} else {

t[x].size--;

int d = t[x].val < val;

del(t[x].son[d], val);

}

}

int rank(int x, int val) {

if(!x) return 0;

if(t[x].val == val) return t[t[x].son[0]].size + 1;

if(t[x].val > val) {

return rank(t[x].son[0], val);

} else {

return rank(t[x].son[1], val) + t[t[x].son[0]].size + t[x].cnt;

}

}

int kth(int x, int rnk) {

if(!x) return 0x7fffffff;

if(rnk <= t[t[x].son[0]].size) {

return kth(t[x].son[0], rnk);

} else {

if(rnk <= t[t[x].son[0]].size + t[x].cnt) {

return t[x].val;

} else {

return kth(t[x].son[1], rnk - t[x].cnt - t[t[x].son[0]].size);

}

}

}

int pre(int x, int val) {

if(!x) return -0x7fffffff;

if(t[x].val >= val) {

return pre(t[x].son[0], val);

} else {

return max(pre(t[x].son[1], val), t[x].val);

}

}

int nxt(int x, int val) {

if(!x) return 0x7fffffff;

if(t[x].val <= val) {

return nxt(t[x].son[1], val);

} else {

return min(nxt(t[x].son[0], val), t[x].val);

}

}

int flag = 0, change[10010], c[10010];

void order(int x) {

if(!x) return ;

if(t[x].cnt > 1) {

change[++flag] = t[x].val;

c[flag] = t[x].cnt;

t[x].cnt = 1;

}

order(t[x].son[0]);

order(t[x].son[1]);

}

void update() {

for(int i = 1; i <= flag; i++) {

if(c[i] % 2 == 0) {

del(root, change[i]);

}

for(int j = 0; j < c[i] / 2; j++) {

insert(root, change[i] + 1);

}

}

}

void order1(int x) {

if(!x) return;

order1(t[x].son[0]);

c[++flag] = t[x].val;

order1(t[x].son[1]);

}

int main() {

int n;

cin >> n;

build();

srand(time(NULL));

for(int i = 1; i <= n; i++) {

int data; cin >> data;

insert(root, data);

}

while(1) {

flag = 0;

order(root);

if(!flag) break;

update();

}

flag = -1;

memset(c, 0, sizeof(c));

order1(root);

c[0] = -1;

int ans = 0;

for(int i = 1; i < flag; i++) {

// cout << c[i] << endl;

ans += c[i] - c[i - 1] - 1;

}

cout << ans << endl;

return 0;

}

Loading [MathJax]/jax/output/HTML-CSS/

发布评论

评论列表 (0)

  1. 暂无评论