为什么输出会和答案误差1(30分求助)
查看原帖
为什么输出会和答案误差1(30分求助)
762588
Edgebright楼主2023/8/4 23:57

数据1的第2643行,答案为115,我输出114;第2644行,答案为248,我输出249.

其他点也是差不多,每个数据几乎都是很后面几千几万行突然少1(很少有多1)

调了好久了才到现在这个状态,已经调不动了,求助大佬

#include<bits/stdc++.h>

using namespace std;
const int N = 100005;
int n;
struct edge
{
	int n, t;
}e[N << 1];
int h[N], cnt;
inline void add(int u, int v)
{
	e[++cnt] = {h[u], v};
	h[u] = cnt; return;
}
int sz[N], hvy[N], dfn[N], top[N], ed[N], fa[N];
int id[N];
int Tstamp;
void getsize(int u, int f)
{
	sz[u] = 1; fa[u] = f;
	for(int i = h[u]; i; i = e[i].n)
	{
		int to = e[i].t;
		if(to == f) continue;
		getsize(to, u);
		sz[u] += sz[to];
		if(sz[hvy[u]] < sz[to]) hvy[u] = to;
	}
	return;
}
void dfs(int u, int f)
{
	dfn[u] = ++Tstamp;
	ed[u] = dfn[u];
	if(u == hvy[f])
	{
		top[u] = top[f];
	}
	else
	{
		top[u] = u;
	}
	if(hvy[u] != n + 4) dfs(hvy[u], u);
	ed[u] = max(ed[u], ed[hvy[u]]);
	for(int i = h[u]; i; i = e[i].n)
	{
		int to = e[i].t;
		if(to == f || to == hvy[u])continue;
		dfs(to, u);
		ed[u] = max(ed[u], ed[to]);
	}
	return;
}
struct nd
{
	int l, r;
	int tag, num;
};
struct segt
{
	nd s[N << 2];
	void spread(int p)
	{
		if(s[p].tag == -1) return;
		s[p<<1].tag = s[p].tag;
		s[p<<1].num = s[p].tag ? (s[p<<1].r - s[p<<1].l + 1) : 0;
		s[p<<1|1].tag = s[p].tag;
		s[p<<1|1].num = s[p].tag ? (s[p<<1|1].r - s[p<<1|1].l + 1) : 0;
		s[p].tag = -1; return;
	}
	void upd(int p)
	{
		s[p].num = s[p<<1].num + s[p<<1|1].num;
		return;
	}
	void build(int p, int l, int r)
	{
		s[p].l = l; s[p].r = r; s[p].tag = -1;
		if(l == r)
		{
			return;	
		}
		int Md = (l + r) >> 1;
		build(p<<1, l, Md);
		build(p<<1|1, Md + 1, r);
		return;	
	}
	void mdf(int p, int l, int r, bool tar)
	{
		if(l <= s[p].l && s[p].r <= r)
		{
			s[p].tag = tar;
			if(tar == 1) s[p].num = s[p].r - s[p].l + 1;
			else s[p].num = 0;
			return;
		}
		spread(p);
		int Md = (s[p].l + s[p].r) >> 1;
		if(l <= Md) mdf(p<<1, l, r, tar);
		if(Md < r) mdf(p<<1|1, l, r, tar);
		upd(p);
		return;
		
	}
	int qry(int p, int l, int r)
	{
		if(l <= s[p].l && s[p].r <= r)
		{
			return s[p].num;
		}
		spread(p);
		int Md = (s[p].l + s[p].r) >> 1;
		int res = 0;
		if(l <= Md) res += qry(p<<1, l, r);
		if(r > Md) res += qry(p<<1|1, l, r);
		upd(p);
		return res;
	}
};
segt t;
int unins(int x)
{
	int res = t.qry(1, dfn[x], ed[x]);
	t.mdf(1, dfn[x], ed[x], 0);
	return res;
}
int ins(int x)
{
	int res = 0;
	do
	{
		int len = dfn[x] - dfn[top[x]] + 1;
		res += len - t.qry(1, dfn[top[x]], dfn[x]);
		t.mdf(1, dfn[top[x]], dfn[x], 1);
		if(top[x] != 0) x = fa[top[x]];
		else break;
	}while(x);
	return res;
}
void init()
{
	for(int i = 0; i <= n + 4; ++i) hvy[i] = n + 4;
	getsize(0, n + 3);
	dfs(0, n + 3);
	top[0] = 0;
	t.build(1, 1, n);
	return;
}
int m;
signed main()
{
//	freopen("app.in", "r", stdin);
//	freopen("app.out", "w", stdout);
	scanf("%d", &n);
	for(int i = 1; i < n; ++i)
	{
		int fa; scanf("%d", &fa);
		add(fa, i);
	}
	init();
	scanf("%d", &m);
	for(int i = 1; i <= m; ++i)
	{
		char op[10]; int x;
		scanf("%s%d", op + 1, &x);
		if(op[1] == 'i')
		{
			printf("%d\n", ins(x));
		}
		else if(op[1] == 'u')
		{
			printf("%d\n", unins(x));
		}
		else puts("Err");
	}
	return 0;
}
2023/8/4 23:57
加载中...