黑白树V2

题目

1.设每个点的权值为 u − f a u u-fa_u ufau,那么两个黑点的贡献就是他们到根的链并的权值和,可以通过链加求链和解决询问和单点修改。
2.对于子树修改,先对于这个奇数距离,开两个数据结构分别维护深度为奇数和深度为偶数的,那么就是子树翻转加上链加,可以再计算白点的链和来实现子树翻转标记。
3.注意需要求子树内黑点个数。
4.其实不是很长,只是询问修改操作很多而已。

A C   C o d e \mathcal AC \ Code AC Code

#include<bits/stdc++.h>
#define maxn 200005
#define LL long long
using namespace std;

char cb[1<<16],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<16,stdin),cs==ct)?0:*cs++)
void read(int &res){
   
	char ch;
	for(;!isdigit(ch=getc()););
	for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0');
}

int n,m;

int info[maxn],Prev[maxn<<1],to[maxn<<1],cnt_e;
void Node(int u,int v){
    Prev[++cnt_e]=info[u],info[u]=cnt_e,to[cnt_e]=v; }
int col[maxn];
int pos[maxn],id[maxn],fa[maxn],son[maxn],sz[maxn],dep[maxn],tp[maxn],ed[maxn],tot;
int ssp[2][2][maxn];
void dfs0(int u,int ff){
   
	sz[u] = 1 , fa[u] = ff , dep[u] = dep[ff] + 1;
	ssp[dep[u]&1][col[u]][u] = 1;
	for(int i=info[u],v;i;i=Prev[i]) if((v=to[i])^ff){
   
		dfs0(v,u),sz[u]+=sz[v],(sz[v]>sz[son[u]])&&(son[u]=v);
		for(int j=0;j<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值