什么情况应该输出0啊,求助求助求助
查看原帖
什么情况应该输出0啊,求助求助求助
793142
anmengxun楼主2023/9/26 20:48
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#define Ls tree[now].ls
#define Rs tree[now].rs
#define V tree[now].v
#define N 100005
using namespace std;
int n,m,q;
//normal tree
vector <int> edge[N];
int fa[N],depth[N],maxdp;
void rendie(int now)
{
	depth[now] = depth[fa[now]] + 1;
	maxdp = max(maxdp,depth[now]);
	for (int ch : edge[now])
	{
		if (ch == fa[now])
		{
			continue;
		}
		fa[ch] = now;
		rendie(ch);
	}
}
//seg tree
int root[N],next_root = 0,latest = 0;
struct Node{
	int ls,rs;
	long long v;
}tree[N * 40];
//instruction
struct Ins{
	int node,cdp,adp,id,ans;//节点编号,染色深度,节点的深度,询问出现的顺序,答案 
}ins[N];
bool cmp1(Ins i1,Ins i2)
{
	return i1.adp > i2.adp;
}
bool cmp2(Ins i1,Ins i2)
{
	return i1.id < i2.id;
}
void update(int now)
{
	V = tree[Ls].v + tree[Rs].v;
}
void add(int &now,int q,int x,int l,int r)//geshu nage
{
	if (now == 0)
	{
		now = ++latest;
	}
	if (l == r)
	{
		V += q;
		return;
	}
	int mid = (l + r) / 2;
	if (x <= mid)
	{
		add(Ls,q,x,l,mid);
	}
	else
	{
		add(Rs,q,x,mid + 1,r);
	}
	update(now);
}
void merge(int &now,int old,int l,int r)
{
	if (old == 0 || now == 0)
	{
		now = now + old;
		return; 
	}
	if (l == r)
	{
		V = V + tree[old].v;
		return;
	}
	int mid = (l + r) / 2;
	merge(Ls,tree[old].ls,l,mid);
	merge(Rs,tree[old].rs,mid + 1,r);
	update(now);
}
void merge_node(int to,int node)
{
	if (root[node] != 0)
	{
		merge(to,root[node],1,maxdp);
	}
	else
	{
		add(to,1,depth[node],1,maxdp);///
		for (int ch : edge[node])
		{
			if (ch == fa[node])
			{
				continue;
			}
			merge_node(to,ch);
		}
	}
}
int sum(int now,int x,int y,int l,int r)
{
	if (x <= l && r <= y)
	{
		return V;
	}
	long long ans = 0;
	int mid = (l + r) / 2;
	if (x <= mid)
	{
		ans += sum(Ls,x,y,l,mid);
	}
	if (y >= mid + 1)
	{
		ans += sum(Rs,x,y,mid + 1,r);
	}
	return ans;
}
int main()
{
	scanf("%d %d",&n,&m);
	for (int i = 1;i < n;i++)
	{
		int u,v;
		scanf("%d %d",&u,&v);
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	rendie(1);
	int coldp = 0x3f;//now color depth
	for (int i = 1;i <= m;i++)
	{
		int opt,x;
		scanf("%d %d",&opt,&x);
		if (opt == 1)
		{
			coldp = x;
		}
		else
		{
			ins[q].id = q;
			ins[q].cdp = coldp;
			ins[q].node = x;
			ins[q].adp = depth[x];
			q++;
		}
	}
	sort(ins,ins + q,cmp1);
	for (int i = 0;i < q;i++)
	{
		if (root[ins[i].node] != 0)
		{
			if (ins[i].cdp > maxdp)
			{
				ins[i].ans = 0;
				continue;
			}
			ins[i].ans = sum(root[ins[i].node],ins[i].cdp,maxdp,1,maxdp);
		}
		else
		{
			if (ins[i].cdp > maxdp)
			{
				ins[i].ans = 0;
				continue;
			}
			root[ins[i].node] = ++latest;
			add(root[ins[i].node],1,depth[ins[i].node],1,maxdp);
			for (int ch : edge[ins[i].node])
			{
				if (ch == fa[ins[i].node])
				{
					continue;
				}
				merge_node(root[ins[i].node],ch);
			}
			ins[i].ans = sum(root[ins[i].node],ins[i].cdp,maxdp,1,maxdp);
		}
	}
	sort(ins,ins + q,cmp2);
	for (int i = 0;i < q;i++)
	{
		printf("%d\n",ins[i].ans);
	}
	return 0;
}

有几个点应该输出0,但是我好像输出了1开头的某个数(可能是1)。 真的调不动啦,自己造的测试点都过了,实在想不出来还有什么可能。 求大佬调调orz

2023/9/26 20:48
加载中...