类似于[NOI2021]轻重边的逆过程,操作1即为对$u$​执行access(根为1),$dist(u,v)$​即为$u$​到$v$​的虚边数

对前者用LCT维护,并记录轻重边的切换,显然切换总量为$o(n\log n)$

换言之,问题即要支持:

1.修改一条边的边权(实边边权为0,虚边边权为1),共$o(n\log n)$​次

2.查询两点间的带权距离

3.查询一个点到子树内所有点的带权距离和

4.查询所有重链长度$l$的$\frac{l(l-1)}{2}$之和

关于询问2,将修改边权转换为子树修改和单点查询,并特判lca处即可

关于询问3,即子树内所有边权为1的边的子树大小之和,同样可以子树查询

关于询问4,在切换轻重边时维护即可(即splay的子树大小)

最终,总复杂度为$o(n\log^{2}n)$​,可以通过

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 100005
4 #define ll long long
5 #define L (k<<1)
6 #define R (L+1)
7 #define mid (l+r>>1)
8 int E,t,n,m,p,x,y,head[N],dfn[N],sz[N],dep[N],fa[N][20];
9 ll ans,f[2][N];
10 struct Edge{
11 int nex,to;
12 }edge[N<<1];
13 int lowbit(int k){
14 return (k&(-k));
15 }
16 void update(int p,int k,int x){
17 while (k<=n){
18 f[p][k]+=x;
19 k+=lowbit(k);
20 }
21 }
22 ll query(int p,int k){
23 ll ans=0;
24 while (k){
25 ans+=f[p][k];
26 k-=lowbit(k);
27 }
28 return ans;
29 }
30 void update(int k,int p){
31 update(0,dfn[k],p);
32 update(0,dfn[k]+sz[k],-p);
33 update(1,dfn[k],p*sz[k]);
34 }
35 int lca(int x,int y){
36 if (dep[x]<dep[y])swap(x,y);
37 for(int i=19;i>=0;i--)
38 if (dep[fa[x][i]]>=dep[y])x=fa[x][i];
39 if (x==y)return x;
40 for(int i=19;i>=0;i--)
41 if (fa[x][i]!=fa[y][i]){
42 x=fa[x][i];
43 y=fa[y][i];
44 }
45 return fa[x][0];
46 }
47 namespace LCT{
48 int fa[N],sz[N],ch[N][2];
49 ll C(int k){
50 return (ll)k*(k-1)/2;
51 }
52 void clear(){
53 memset(fa,0,sizeof(fa));
54 memset(ch,0,sizeof(ch));
55 for(int i=1;i<=n;i++)sz[i]=1;
56 }
57 bool which(int k){
58 return ch[fa[k]][1]==k;
59 }
60 bool check(int k){
61 return ch[fa[k]][which(k)]!=k;
62 }
63 void up(int k){
64 sz[k]=sz[ch[k][0]]+sz[ch[k][1]]+1;
65 }
66 void rotate(int k){
67 int f=fa[k],g=fa[f],p=which(k);
68 fa[k]=g;
69 if (!check(f))ch[g][which(f)]=k;
70 fa[ch[k][p^1]]=f,ch[f][p]=ch[k][p^1];
71 fa[f]=k,ch[k][p^1]=f;
72 up(f),up(k);
73 }
74 void splay(int k){
75 for(int i=fa[k];!check(k);i=fa[k]){
76 if (!check(i)){
77 if (which(i)==which(k))rotate(i);
78 else rotate(k);
79 }
80 rotate(k);
81 }
82 }
83 void get_min(int &k){
84 while (ch[k][0])k=ch[k][0];
85 splay(k);
86 }
87 void access(int k){
88 int lst=0;
89 while (k){
90 splay(k),ans-=C(sz[k]);
91 if (lst){
92 get_min(lst);
93 update(lst,-1);
94 }
95 swap(ch[k][1],lst);
96 if (lst){
97 ans+=C(sz[lst]);
98 get_min(lst);
99 update(lst,1);
100 }
101 up(k),lst=k,k=fa[k];
102 }
103 ans+=C(sz[lst]);
104 }
105 };
106 void add(int x,int y){
107 edge[E]=Edge{head[x],y};
108 head[x]=E++;
109 }
110 void dfs(int k,int f,int s){
111 dfn[k]=++dfn[0];
112 sz[k]=1;
113 dep[k]=s;
114 fa[k][0]=LCT::fa[k]=f;
115 if (!f)fa[k][0]=k;
116 for(int i=1;i<20;i++)fa[k][i]=fa[fa[k][i-1]][i-1];
117 for(int i=head[k];i!=-1;i=edge[i].nex)
118 if (edge[i].to!=f){
119 dfs(edge[i].to,k,s+1);
120 sz[k]+=sz[edge[i].to];
121 }
122 }
123 int main(){
124 scanf("%d",&t);
125 while (t--){
126 scanf("%d%d",&n,&m);
127 E=ans=dfn[0]=0;
128 LCT::clear();
129 memset(head,-1,sizeof(head));
130 memset(f,0,sizeof(f));
131 for(int i=1;i<n;i++){
132 scanf("%d%d",&x,&y);
133 add(x,y);
134 add(y,x);
135 }
136 dfs(1,0,0);
137 for(int i=2;i<=n;i++)update(i,1);
138 for(int i=1;i<=m;i++){
139 scanf("%d",&p);
140 if (p==1){
141 scanf("%d%*d",&x);
142 LCT::access(x);
143 }
144 if (p==2){
145 scanf("%d%d",&x,&y);
146 printf("%d\n",query(0,dfn[x])+query(0,dfn[y])-(query(0,dfn[lca(x,y)])<<1));
147 }
148 if (p==3){
149 scanf("%d",&x);
150 printf("%lld\n",query(1,dfn[x]+sz[x]-1)-query(1,dfn[x]));
151 }
152 if (p==4)printf("%lld\n",ans);
153 }
154 }
155 return 0;
156 }

[hdu7012]Miserable Faith的更多相关文章

  1. faith的23堂课:培养良好的工作方法与做事风格

    目标:通过每天一点的学习和实践,逐步形成好的做事风格和工作生活习惯. 方式:每天教一点,实践一点. 第一课 计划与总结,工作日志,戴明环 第二课 目的性:搞清楚,你每个行为的目的 第三课 目标管理,调 ...

  2. 你要相信你所做的一切对一个更美好的世界 Do have faith in what you are doing All for a better world

    http://www.nowamagic.net/librarys/veda/detail/2502 Do have faith in what you are doing. 先不要往下看,试试品尝上 ...

  3. Faith 信念

    Today I’d like to talk about faith. With faith, you’ll go further and never be lost. Faith is free a ...

  4. 【题解】「AT4303」[ABC119D] Lazy Faith

    AT4303 [ABC119D] Lazy Faith[题解][二分] AT4303 translation 有 \(a\) 个点 \(s\),有 \(b\) 个点 \(t\),问从点 \(x\) 出 ...

  5. if you end up with a boring miserable life

  6. Winter is coming Just have a little faith. JSF框架简介与实例

    JSF 体系结构: JSF 的主要优势之一就是它既是Java Web应用程序的用户界面标准又是严格遵循模型-视图-控制器 (MVC) 设计模式的框架.用户界面代码(视图)与应用程序数据和逻辑(模型)的 ...

  7. 时隔一年再读到the star

    The Star Arthur C. Clarke It is three thousand light-years to the Vatican. Once, I believed that spa ...

  8. How To Handle a Loss of Confidence in Yourself

    Do you feel like you've lost confidence in yourself? Have you had strong self doubts? Perhaps you we ...

  9. sentence patterns

    第四部分     推理题 1.世界上每个角落的每个人都有立场,都有背景,都有推理性,能推理出一个人语言的真意,才成就了真正的推理能力: 2.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...

随机推荐

  1. oracle 不能用上下键调用sql语句

    在Linux的sqlplus中运行SQL语句之后,想用上下键把历史命令找出来,发现不支持. 安装rlwrap 重启sqlplus 3,使用rlwrap,rlwrap sqlplus / as sysd ...

  2. DDD领域驱动设计落地实践(十分钟看完,半小时落地)

    一.引子 不知今年吹了什么风,忽然DDD领域驱动设计进入大家视野.该思想源于2003年 Eric Evans编写的"Domain-Driven Design领域驱动设计"简称DDD ...

  3. ServletContext 学习

    ServletContext web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用: 1.共享数据 ​ 在这个Servlet中保存了数 ...

  4. 【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:

    问题: 假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示: unsigned char[16] = {0x3f, 0xa0, 0x00, 0x00, 0x ...

  5. JAVA的array中indexOf

    记得龙哥有个重构的文章里说直接判断啥的. 今天看JDK ArrayList,看到了他的 indexOf,他先判断,后进入循环,看似写了两遍for 循环,但是简单明了暴力.i like it . pub ...

  6. Alpha-功能规格说明书

    项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.引言 1. 项目简介 项目团队:删库跑路对不队 项目名称:题士 项目内容 ...

  7. 嵌入式单片机stm32之DMA实验

    一. 对于大容量的STM32芯片有2个DMA控制器,控制器1有7个通道,控制器2有5个通道 每个通道都可以配置一些外设的地址. 二. 通道的配置过程: 1. 首先设置CPARx寄存器和CMARx寄存器 ...

  8. 字符串与模式匹配算法(四):BM算法

    一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...

  9. hdu 1856 More is better(并查集)

    题意: Mr Wang wants some boys to help him with a project. Because the project is rather complex, the m ...

  10. 【mysql3】我的大学teacher课程进行中|持续更新系列!

    1.做一下powerdesigner的画图 2.所有的创建表格 .....1 修改字段的数据类型:alter table 表名 modify 字段名 新数据类型; 修改字段名: alter table ...