社区讨论

?

P6136【模板】普通平衡树(数据加强版)参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@loc23hcm
此快照首次捕获于
2023/10/30 06:42
2 年前
此快照最后确认于
2023/11/04 12:17
2 年前
查看原帖
我的替罪羊树,过了普通版,代码基本没改
一直全部Re,调数组大小啥都不好使,下了数据本机也能过,然后我想看看到底是哪出问题了
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
#define ls b[t].ch[0]
#define rs b[t].ch[1]
using namespace std; 

const int N = 4e5 + 5;
const double M = 0.75; 
struct ScT
{
	int d, ch[2], size, num; 
}b[N]; 
int n, m, cnt, l, r, q[N * 2], w[N], a[N], c[N], tt, root; 
bool check(int t)
{
	return 1; 
}
int newnode()
{
	int t; 
	t = ++cnt; 
	b[t].d = ls = rs = 0; 
	b[t].size = b[t].num = 1; 
	return t; 
}
void pushup(int t)
{
	b[t].size = b[ls].size + b[rs].size + b[t].num; 
}
void dfs1(int t)
{
	if(ls)dfs1(ls); 
	if(b[t].num){w[++tt] = b[t].d; a[tt] = b[t].num; }
	if(rs)dfs1(rs); 
	q[++r] = t; 
}
int dfs2(int l, int r)
{
	if(l > r)return 0; 
	int t = newnode(); 
	int m = (l + r) >> 1; 
	ls = dfs2(l, m - 1); 
	b[t].d = w[m]; b[t].num = a[m]; 
	rs = dfs2(m + 1, r); 
	pushup(t); 
	return t; 
}
int rebuild(int t, int fa)
{
	tt = 0; 
	//dfs1(t); 
}

void insert(int t, int x, int fa)
{
	if(x == b[t].d)
		b[t].num++; 
	else if(x < b[t].d)
		if(ls)insert(ls, x, t); else{ls = newnode(); b[ls].d = x; }
	else
		if(rs)insert(rs, x, t); else{rs = newnode(); b[rs].d = x; }		
	pushup(t); 
   rebuild(0,0)//这里
}
int main()
{
	scanf("%d%d", &n, &m); 
	l = 1; r = 0; 
	root = newnode(); scanf("%d", &b[root].d); 
	for(int i = 2; i <= n; i++)
	{
		scanf("%d", &c[i]); 
		insert(root, c[i], 0); 
	}/*
	int last = 0, op, x, d, ans = 0;  
	for(int i = 1; i <= m; i++)
	{
		scanf("%d%d", &op, &x); 
		x ^= last; 
		if(op == 1)
			insert(root, x, 0); 
		else if(op == 2)
			del(root, x, 0); 
		else if(op == 3)
		{
			d = getrank(root, x) + 1; 
			last = d; ans ^= d; 
		}
		else if(op == 4)
		{
			d = getd(root, x); 
			last = d; ans ^= d; 
		}
		else if(op == 5)
		{
			d = getd(root, getrank(root, x)); 
			last = d; ans ^= d; 
		}
		else if(op == 6)
		{
			d = getd(root, getrank(root, x) + getsum(root, x) + 1); 
			last = d; ans ^= d; 
		}
	}
	printf("%d\n", ans); */
	return 0; 
}
注释掉了所有的查询和重建,rebuild里面什么都不剩
然后有一个rebuild(0,0)就是re,删掉就是wa
https://www.luogu.com.cn/record/54722749
https://www.luogu.com.cn/record/54722733
不是很能理解

回复

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

正在加载回复...