数据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;
}