[hdu7012]Miserable Faith
类似于[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的更多相关文章
- faith的23堂课:培养良好的工作方法与做事风格
目标:通过每天一点的学习和实践,逐步形成好的做事风格和工作生活习惯. 方式:每天教一点,实践一点. 第一课 计划与总结,工作日志,戴明环 第二课 目的性:搞清楚,你每个行为的目的 第三课 目标管理,调 ...
- 你要相信你所做的一切对一个更美好的世界 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. 先不要往下看,试试品尝上 ...
- Faith 信念
Today I’d like to talk about faith. With faith, you’ll go further and never be lost. Faith is free a ...
- 【题解】「AT4303」[ABC119D] Lazy Faith
AT4303 [ABC119D] Lazy Faith[题解][二分] AT4303 translation 有 \(a\) 个点 \(s\),有 \(b\) 个点 \(t\),问从点 \(x\) 出 ...
- if you end up with a boring miserable life
- Winter is coming Just have a little faith. JSF框架简介与实例
JSF 体系结构: JSF 的主要优势之一就是它既是Java Web应用程序的用户界面标准又是严格遵循模型-视图-控制器 (MVC) 设计模式的框架.用户界面代码(视图)与应用程序数据和逻辑(模型)的 ...
- 时隔一年再读到the star
The Star Arthur C. Clarke It is three thousand light-years to the Vatican. Once, I believed that spa ...
- 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 ...
- sentence patterns
第四部分 推理题 1.世界上每个角落的每个人都有立场,都有背景,都有推理性,能推理出一个人语言的真意,才成就了真正的推理能力: 2.换言之,如果你能通过一个人的说话推理出其身份职业,你的推理能 ...
随机推荐
- oracle 不能用上下键调用sql语句
在Linux的sqlplus中运行SQL语句之后,想用上下键把历史命令找出来,发现不支持. 安装rlwrap 重启sqlplus 3,使用rlwrap,rlwrap sqlplus / as sysd ...
- DDD领域驱动设计落地实践(十分钟看完,半小时落地)
一.引子 不知今年吹了什么风,忽然DDD领域驱动设计进入大家视野.该思想源于2003年 Eric Evans编写的"Domain-Driven Design领域驱动设计"简称DDD ...
- ServletContext 学习
ServletContext web容器在启动的时候,它会为每个web程序都创建一个对应的ServletContext对象,它代表了当前的web应用: 1.共享数据 在这个Servlet中保存了数 ...
- 【实验向】问题:假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示:
问题: 假设计算机A和计算机B通信,计算机A给计算机B发送一串16个字节的二进制字节串,以数组形式表示: unsigned char[16] = {0x3f, 0xa0, 0x00, 0x00, 0x ...
- JAVA的array中indexOf
记得龙哥有个重构的文章里说直接判断啥的. 今天看JDK ArrayList,看到了他的 indexOf,他先判断,后进入循环,看似写了两遍for 循环,但是简单明了暴力.i like it . pub ...
- Alpha-功能规格说明书
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 团队项目-计划-功能规格说明书 一.引言 1. 项目简介 项目团队:删库跑路对不队 项目名称:题士 项目内容 ...
- 嵌入式单片机stm32之DMA实验
一. 对于大容量的STM32芯片有2个DMA控制器,控制器1有7个通道,控制器2有5个通道 每个通道都可以配置一些外设的地址. 二. 通道的配置过程: 1. 首先设置CPARx寄存器和CMARx寄存器 ...
- 字符串与模式匹配算法(四):BM算法
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...
- hdu 1856 More is better(并查集)
题意: Mr Wang wants some boys to help him with a project. Because the project is rather complex, the m ...
- 【mysql3】我的大学teacher课程进行中|持续更新系列!
1.做一下powerdesigner的画图 2.所有的创建表格 .....1 修改字段的数据类型:alter table 表名 modify 字段名 新数据类型; 修改字段名: alter table ...