分析
因为安装一个软件包要把它前面的都安装,所以其实是在一棵树中,点x到根节点都要安装。
同理,删除一个软件包就是删除x及其子树。
这样,我们就可以用树剖来解决了。
改变的数量就是上次的结点数与现在的结点数的差的绝对值。(有点绕)
代码
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
#define full(a,b) memset(a,b,sizeof a)
#define N 100005
int n,q;
int head[N],ecnt,nxt[N],to[N];
int dad[N],son[N],dep[N],size[N];
int top[N],id[N],rev[N];
int last,s[4*N],lazy[4*N];
void init()//初始化
{
full(head,-1);
full(lazy,-1);
}
int read()//快读
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') f=ch=='-'?-1:1,ch=getchar();
while(ch>='0'&&ch<='9') x=10*x+ch-'0',ch=getchar();
return x*f;
}
void add(int u