- 加入一条路径
- 删除一条已加入的路径
- 询问不过一个点x的路径的最大值。
思路:
直接树链剖分维护答案。 因为询问的事不过点xxx的最大值,因此对于一条路径我们只需要修改它的补集。 考虑到树上一条到根节点的路径映射到序列上只有logloglog段,因此它的补集也只有logloglog段,这样就可以修改了。 然后有了一种叫做删除的操作。 不难想到可以用可删堆+永久化标记。 代码很简单。 代码:#include#define ri register int#define lc (p<<1)#define rc (p<<1|1)#define mid (l+r>>1)using namespace std;inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar(); return ans;}typedef pair pii;const int N=2e5+5;int n,m,sig=0,tot=0,fa[N],hson[N],dep[N],top[N],siz[N],num[N],pred[N];pii stk[N];vector e[N];struct Node{ int a,b,v;}qry[N];void dfs1(int p){ siz[p]=1; for(ri i=0,v;i siz[hson[p]])hson[p]=v; }}void dfs2(int p,int tp){ top[p]=tp,pred[num[p]=++tot]=p; if(!hson[p])return; dfs2(hson[p],tp); for(ri i=0,v;i