关于一个2=0的问题
  • 板块学术版
  • 楼主灰的积雨云
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/11/13 11:29
  • 上次更新2023/10/27 03:08:13
查看原帖
关于一个2=0的问题
349713
灰的积雨云楼主2022/11/13 11:29

这是一个动态开点值域线段树(可能?

int build()
{
	v[id].emplace_back((SGT){0, 0, 0});
	printf("<%d>\n",v[id].size()-1);
	return (v[id].size() - 1);
}
if (!v[id][p].lc) v[id][p].lc = build(); 	
insert(v[id][p].lc, l, mid, pos, val);

这一块的代码

build()返回的值是2

但是在insert前输出lc

lc的值为0

下面是完整代码

#include <cstdio>
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>
#define lfor(i, x, y) for (int i = (x); i <= (y); ++ i)
#define llfor(i, x, y) for (int i = (x); i < (y); ++ i)
#define rfor(i, x, y) for (int i = (x); i >= (y); -- i)
#define rlfor(i, x, y) for (int i = (x); i > (y); -- i)
#define For(p) for (int i = head[p]; i; i = nxt[i])
using namespace std;

const int N = 2e5 + 10;
const int INF = 1e9 + 10;
struct SGT
{
	int lc, rc;
	int dat;
};
vector<SGT> v[N];
vector<int> x[N];
int id;
map<int, int> val;

int build()
{
	v[id].emplace_back((SGT){0, 0, 0});
	printf("<%d>\n",v[id].size()-1);
	return (v[id].size() - 1);
}

void insert(int p, int l, int r, int pos, int val)
{
	printf("<%d> %d %d %d %d\n", p, l, r, pos, val);
	if (l == r) {v[id][p].dat += val; return;}
	int mid = (l + r) >> 1;
	if (pos <= mid) 
	{
		if (!v[id][p].lc) putchar('@'),v[id][p].lc = build(); 	
		printf("! %d %d\n", v[id][p].lc, v[id].size());
		insert(v[id][p].lc, l, mid, pos, val);
	}
	else 
	{
		puts("2");
		if (!v[id][p].rc) v[id][p].rc = build();
		insert(v[id][p].rc, mid + 1, r, pos, val);
	}
}

int ask(int p, int l, int r, int L, int R)
{
	if (L <= l && r <= R) return v[id][p].dat;
	int mid = (l + r) >> 1, ans = 0;
	if (L <= mid && v[id][p].lc) ans += ask(v[id][p].lc, l, mid, L, R);
	if (R > mid && v[id][p].rc) ans += ask(v[id][p].rc, mid + 1, r, L, R);	
	return  ans;
}

int main()
{
	int m, q; scanf("%d", &m);
	lfor (i, 1, m)
	{
		id = i; v[id].emplace_back((SGT){0, 0, 0});
		int n, root = build(); scanf("%d", &n); 
		lfor (j, 1, n) 
		{ 
			int a; scanf("%d", &a);
			x[id].emplace_back(a);
			insert(1, 1, INF, a, 1);
		}
	}
	scanf("%d", &q);
	lfor (i, 1, q)
	{
		int a, b, ans = 0; scanf("%d %d", &a, &b); id = a;
		llfor (j, 0, x[b].size()) ans += ask(1, 1, INF, 1, x[b][j]);
		printf("%d\n", ans);
	}
 	return 0;
}
2022/11/13 11:29
加载中...