类似于[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. vite首次启动加载慢

    背景 随着vue3的到来,vite开始被各大vue3组件库使用,公司开始一个新项目,准备尝试用vite试一波. 问题发现 当把公司新项目移植到vite后,启动非常快,但发现页渲染时间慢了很多 可以看到 ...

  2. 怒肝 Linux 学习路线,这回不难

    Linux 学习路线 by 鱼皮. 原创不易,请勿抄袭,违者必究! 大家好,我是鱼皮,又花 1 周肝出了 Linux 学习资料全家桶,包括学习路线.命令手册.视频.书籍.文档.实战教程.社区.工具.大 ...

  3. WinForm事件与消息

    WinForm事件与消息 消息概述以及在C#下的封装 Windows下应用程序的执行是通过消息驱动的.所有的外部事件,如键盘输入.鼠标移动.按动鼠标都由OS系统转换成相应的"消息" ...

  4. 20 行代码:Serverless 架构下用 Python 轻松搞定图像分类和预测

    作者 | 江昱 前言 图像分类是人工智能领域的一个热门话题.通俗解释就是,根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法. 它利用计算机对图像进行定量分析,把图像或图像中 ...

  5. 运行WampServer提示计算机中丢失 msvcr110.dll

    ​ 在第一次运行WampServer的时候,出现"无法启动此程序,因为计算机中丢失 MSVCR110.dll.尝试重新安装该程序以解决此问题. ​ 在浏览器的地址栏里输入 http://ww ...

  6. 2020.10.16--vj个人赛补题

    D - Drinks Choosing Old timers of Summer Informatics School can remember previous camps in which eac ...

  7. Flink Sql 之 Calcite Volcano优化器(源码解析)

    Calcite作为大数据领域最常用的SQL解析引擎,支持Flink , hive,  kylin , druid等大型项目的sql解析 同时想要深入研究Flink sql源码的话calcite也是必备 ...

  8. Hash窃取与传递

    Hash窃取与传递 NTHASH(NTLM) 在 Windows中, 存储的密码Hash就叫做 NTHash,也叫做 NTLM,其中NTLM 全称是 "NT LAN Manager" ...

  9. python jinja2初见

    吸取了长城杯的教训,学习python-web迫在眉睫. 正常难度的python_template_injection,由于现在没学面向对象,理解原理比较困难,所以先使用简单版复现:并附上正常版的常用p ...

  10. Sharding-JDBC自定义复合分片算法

    Sharding-JDBC自定义复合分片算法 一.背景 二.需求 1.对于客户端操作而言 2.对于运营端操作而言 三.分片算法 1.客户id和订单id的生成规则 2. 确定数据落在那个表中 3.举例说 ...