类似于[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. Java程序的执行过程

    Java程序的执行过程 编译器将 Java 源代码编译成字节码class文件 类加载到 JVM 里面后,执行引擎把字节码转为可执行代码 执行的过程,再把可执行代码转为机器码,由底层的操作系统完成执行

  2. Firewalls命令行配置

    1.指定端口开放查询.开放.关闭端口 # 查询端口是否开放 firewall-cmd --query-port=8080/tcp # 开放80端口 firewall-cmd --permanent - ...

  3. Dapr + .NET Core实战(十二)服务调用之GRPC

    什么是GRPC gRPC 是一种与语言无关的高性能远程过程调用 (RPC) 框架. gRPC 的主要优点是: 高性能轻量级 RPC 框架. 协定优先 API 开发,默认使用协议缓冲区,允许与语言无关的 ...

  4. 土壤稳定性评估(ArcPy实现)

    一.背景 在进行区域土地开发时,需要对整个区域的土壤稳定性评估.应用GIS空间分析方法,能够快速有效地对影响土壤稳定性的因子进行制图并评估打分,通过构建评价体系,利用叠加分析,形成土壤稳定性专题图,以 ...

  5. Java基础之(四):使用IDEA实现HelloWorld

    使用IDEA实现HelloWorld 在使用IDEA这个集成开发环境写Java程序之前,我们要先对IDEA进行一些基本的配置,以便我们能够更好地使用它. 新建一个空项目,用来学习基础语法 设置项目名称 ...

  6. selenium 4.0 发布

    我们非常高兴地宣布Selenium 4的发布.这适用于Java..net.Python.Ruby和Javascript.你可以从你最喜欢的包管理器或GitHub下载它! https://github. ...

  7. [云计算]Windows Server 2012 R2 配置AD/DNS/DHCP服务

    目录 一.前期准备 1.1 安装Windows Server 2012 R2 1.2 关闭防火墙 1.3 改变计算机名 1.4 挂载并安装Tools 1.5 重启并配置网卡 1.6 添加角色和功能 1 ...

  8. Java生成6位数验证码

    public static String getCode() { return String.valueOf((int) ((Math.random() * 9 + 1) * 100000));} 生 ...

  9. the Agiles Scrum Meeting 9

    会议时间:2020.4.17 20:00 1.每个人的工作 今天已完成的工作 个人结对项目增量开发组:基本实现个人项目创建.仓库自动分配,修复bug issues: 增量组:准备评测机制,增加仓库自动 ...

  10. BUAA_2020_软件工程_个人博客作业

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 了解软件工程的技术,掌握工程化开发的能力 这个作业在哪个具体方 ...