类似于[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. NOIP模拟72

    T1 出了个大阴间题 解题思路 看了看数据,大概是个状压 DP,但是感觉记忆化搜索比较好写一点(然而并不是这样递归比迭代常熟大了许多..) 不难判断出来 b 的数值与合并的顺序无关于是我们可以预先处理 ...

  2. 宝塔Linux面板搭建与安全狗安装(WEB服务器搭建与WAF安装)

    环境 系统:CentOS 7.3 (64位) 软件: 宝塔Linux 7.7 网站安全狗Linux-Apache版V2.3.18809(64位) 宝塔面板 下载和安装 网址:https://www.b ...

  3. docker之swarm容器部署及运维

    1.概念 Docker Swarm 是 Docker 的集群管理工具.它将 Docker 主机池转变为单个虚拟 Docker 主机. Docker Swarm 提供了标准的 Docker API,所有 ...

  4. Ubuntu20.04安装 maven并配置阿里源

    Ubuntu20.04安装 maven并配置阿里源 sudo apt update sudo apt install maven #安装maven,默认安装路径为/usr/share/maven 添加 ...

  5. 倒计时 | 7.24 阿里云 Serverless Developer Meetup 杭州站报名火热进行中!

    本周六阿里云 Serverless Developer Meetup 即将亮相杭州 ​ 时间:7.24 本周六 13:30 - 17:30 地点:杭州市良睦路 999 号乐佳国际 1-3-7 特洛伊星 ...

  6. Data Management Tools(数据管理工具)《二》

    (数据管理工具)<二> 点击跳转(数据管理工具)<一> 16.打包 # Process: 共享包 arcpy.SharePackage_management("&qu ...

  7. 洛谷4400 BlueMary的旅行(分层图+最大流)

    qwq 首先,我们观察到题目中提到的每天只能乘坐一次航班的限制,很容易想到建分层图,也就是通过枚举天数,然后每天加入一层新的点. (然而我一开始想的却是erf) 考虑从小到大枚举天数,然后每次新建一层 ...

  8. Golang通脉之基础入门

    为什么要学 Go 性能优越感:Go 极其地快,其性能与 Java 或 C++相似.在使用中,Go 一般比 Python 要快 30 倍: 序列化/去序列化.排序和聚合中表现优异: 开发者效率较高:多种 ...

  9. 这部分布式事务开山之作,凭啥第一天预售就拿下当当新书榜No.1?

    大家好,我是冰河~~ 今天,咱们就暂时不聊[精通高并发系列]了,今天插播一下分布式事务,为啥?因为冰河联合猫大人共同创作的分布式事务领域的开山之作--<深入理解分布式事务:原理与实战>一书 ...

  10. 2021.8.5考试总结[NOIP模拟31]

    暴力打满直接rk3? T1 Game 想了一万种贪心和两万种$hack$. 可以先用最显然的贪心求出最高得分是多少.(从小到大用最小的大于$b_i$的$a$得分) 然后用一棵权值线段树维护值域内$a$ ...