[树链剖分]List wants to travel,Relief grain,hotel加强版,This world need more Zhu

文章目录

  • B:Relief grain
  • C:hotel加强版

B:Relief grain

题目

将一段区间修改的标记变成差分,每次都是连续一段的dfndfndfn序修改

从小到大枚举dfndfndfn,在一段标记的最开头的dfndfndfn插入,最末尾的dfndfndfn+1+1+1删除

就保证了在这连续的一段都出现了

此时仍然存在于线段树中的标记就一定是经过dfndfndfn序对应回原树的节点

#include <cstdio>
#include <vector>
#include <cstring>
#include <iostream>
using namespace std;
#define maxn 100005
#define MAX 100000
vector < int > G[maxn], ins[maxn], del[maxn];
int n, m, cnt;
int siz[maxn], son[maxn], f[maxn], dep[maxn];
int dfn[maxn], top[maxn], rnk[maxn];
int t[maxn << 2], id[maxn << 2], ans[maxn];void dfs1( int u, int fa ) {son[u] = 0, siz[u] = 1, dep[u] = dep[fa] + 1, f[u] = fa;for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;dfs1( v, u );siz[u] += siz[v];if( ! son[u] || siz[v] > siz[son[u]] )son[u] = v;}
}void dfs2( int u, int t ) {top[u] = t, dfn[u] = ++ cnt, rnk[cnt] = u;if( ! son[u] ) return;dfs2( son[u], t );for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == f[u] || v == son[u] ) continue;else dfs2( v, v );}
}void pushup( int num ) {if( t[num << 1] >= t[num << 1 | 1] ) t[num] = t[num << 1], id[num] = id[num << 1];else t[num] = t[num << 1 | 1], id[num] = id[num << 1 | 1];
}void build( int num, int l, int r ) {t[num] = id[num] = 0;if( l == r ) {id[num] = l;return;}int mid = ( l + r ) >> 1;build( num << 1, l, mid );build( num << 1 | 1, mid + 1, r );
}void modify( int num, int l, int r, int pos, int v ) {if( l == r ) {t[num] += v;return;}int mid = ( l + r ) >> 1;if( pos <= mid ) modify( num << 1, l, mid, pos, v );else modify( num << 1 | 1, mid + 1, r, pos, v );pushup( num );
}void solve( int u, int v, int w ) {int fu = top[u], fv = top[v];while( fu != fv ) {if( dep[fu] < dep[fv] ) swap( fu, fv ), swap( u, v );ins[dfn[fu]].push_back( w );del[dfn[u] + 1].push_back( w );u = f[fu], fu = top[u];}if( dep[u] < dep[v] ) swap( u, v );ins[dfn[v]].push_back( w );del[dfn[u] + 1].push_back( w );
}int main() {while( ~ scanf( "%d %d", &n, &m ) ) {if( ! n && ! m ) return 0;for( int i = 1;i <= n;i ++ ) G[i].clear(), ins[i].clear(), del[i].clear();cnt = 0;for( int i = 1, u, v;i < n;i ++ ) {scanf( "%d %d", &u, &v );G[u].push_back( v );G[v].push_back( u );}dfs1( 1, 0 );dfs2( 1, 1 );for( int i = 1, x, y, z;i <= m;i ++ ) {scanf( "%d %d %d", &x, &y, &z );solve( x, y, z );}build( 1, 1, MAX );for( int i = 1;i <= n;i ++ ) {for( int j = 0;j < ins[i].size();j ++ )modify( 1, 1, MAX, ins[i][j], 1 );for( int j = 0;j < del[i].size();j ++ )modify( 1, 1, MAX, del[i][j], -1 );if( t[1] ) ans[rnk[i]] = id[1];else ans[rnk[i]] = 0;}for( int i = 1;i <= n;i ++ )printf( "%d\n", ans[i] );}return 0;
}

C:hotel加强版

链接

f[u][j]f[u][j]f[u][j]表示uuu子树内距离uuujjj的点个数

g[u][j]g[u][j]g[u][j]表示uuu子树内存在两个点距离它们的lcalcalcaddd,且lcalcalca距离uuud−jd-jdj
在这里插入图片描述
树形DPDPDP,是一个一个儿子暴力计算贡献的

ans+=f[u][j]×g[v][j+1]+g[u][j]×f[v][j−1]ans+=f[u][j]\times g[v][j+1]+g[u][j]\times f[v][j-1]ans+=f[u][j]×g[v][j+1]+g[u][j]×f[v][j1]

f[u][j]×g[v][j+1]f[u][j]\times g[v][j+1]f[u][j]×g[v][j+1]:在uuu已处理过的儿子中距离uuujjj,那么距离现在处理的儿子vvv的距离则为j+1j+1j+1,所以是和以vvv为根的子树内的距离j+1j+1j+1点对进行匹配,即g[v][j+1]g[v][j+1]g[v][j+1]
在这里插入图片描述
g[u][j]×f[v][j−1]g[u][j]\times f[v][j-1]g[u][j]×f[v][j1]:在uuu已处理过的儿子中,两点距离lcalcalcadddlcalcalca距离uuud−jd-jdj的点对数为g[u][j]g[u][j]g[u][j],能与现在处理的儿子vvv匹配的点个数则为f[v][j−1]f[v][j-1]f[v][j1]f[v][j−1]f[v][j-1]f[v][j1]的点距离vvvj−1j-1j1,距离uuu就是jjj
在这里插入图片描述
g[u][j+1]+=f[u][j+1]×f[v][j]g[u][j+1]+=f[u][j+1]\times f[v][j]g[u][j+1]+=f[u][j+1]×f[v][j]f[u][j+1],f[v][j]f[u][j+1],f[v][j]f[u][j+1],f[v][j]相互匹配的点对是很特殊的,因为这些点对的lcalcalca就是uuu,这些点对距离lcalcalcaj+1j+1j+1lcalcalca距离uuu的距离为(j+1)−(j+1)=0(j+1)-(j+1)=0(j+1)(j+1)=0,是符合ggg的定义的
在这里插入图片描述

这种特殊的情况统计后,在uuu往上跳的过程中,uuu不断降级为儿子,目前特殊的lcalcalca等于根的情况在以后就变成了下边的一般化的ggg的转移,那个时候uuu对根的贡献就是正确的了,类似于局部最优的这种思想,特殊情况往上跳就变成了一般情况

g[u][j−1]+=g[v][j]g[u][j-1]+=g[v][j]g[u][j1]+=g[v][j]

g[u][j−1]+=g[v][j]g[u][j-1]+=g[v][j]g[u][j1]+=g[v][j]g[v][j]g[v][j]g[v][j]vvv子树内lcalcalca距离vvvd−jd-jdj的点对数,这些点对数的lcalcalca距离uuu则为d−j+1d-j+1dj+1

在这里插入图片描述
f[u][j+1]+=f[v][j]f[u][j+1]+=f[v][j]f[u][j+1]+=f[v][j]

f[u][j+1]+=f[v][j]f[u][j+1]+=f[v][j]f[u][j+1]+=f[v][j]:很好理解,距离uuuj+1j+1j+1的点个数加上距离当前正在处理的儿子vvv距离为jjj(距离uuu就为j+1j+1j+1)的个数

长链剖分即可

长链剖分不同于重链剖分的无非是不再选用子树最大的儿子作为重儿子,而是选用长度最长(叶子节点深度最深)的儿子作为重儿子

用于处理只与深度有关的树上问题

#include <cstdio>
#include <vector>
#include <iostream>
using namespace std;
#define maxn 100005
#define int long long
vector < int > G[maxn];
int n;
int dep[maxn], son[maxn];
int *f[maxn], *g[maxn], tmp[maxn << 2], *ip = tmp, ans;void dfs1( int u, int fa ) {for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == fa ) continue;dfs1( v, u );dep[u] = max( dep[u], dep[v] );if( dep[v] > dep[son[u]] ) son[u] = v;}dep[u] = dep[son[u]] + 1;
}void dfs2( int u, int fa ) {if( son[u] ) {f[son[u]] = f[u] + 1;g[son[u]] = g[u] - 1;dfs2( son[u], u );}f[u][0] = 1; ans += g[u][0];for( int i = 0;i < G[u].size();i ++ ) {int v = G[u][i];if( v == son[u] || v == fa ) continue;f[v] = ip, ip += ( dep[v] << 1 );g[v] = ip, ip += ( dep[v] << 1 );dfs2( v, u );for( int j = 0;j <= dep[v];j ++ ) {ans += f[u][j] * g[v][j + 1];if( j ) ans += g[u][j] * f[v][j - 1];}for( int j = 0;j <= dep[v];j ++ ) {if( j ) g[u][j - 1]	+= g[v][j];g[u][j + 1] += f[u][j + 1] * f[v][j];f[u][j + 1] += f[v][j];}} 
}signed main() {scanf( "%lld", &n );for( int i = 1, u, v;i < n;i ++ ) {scanf( "%lld %lld", &u, &v );G[u].push_back( v );G[v].push_back( u ); }dfs1( 1, 0 );f[1] = ip, ip += ( dep[1] << 1 );g[1] = ip, ip += ( dep[1] << 1 );dfs2( 1, 0 );printf( "%lld\n", ans );return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

eShopOnContainers 知多少[8]:Ordering microservice

1. 引言Ordering microservice&#xff08;订单微服务&#xff09;就是处理订单的了&#xff0c;它与前面讲到的几个微服务相比要复杂的多。主要涉及以下业务逻辑&#xff1a;订单的创建、取消、支付、发货库存的扣减2. 架构模式如上图所示&#xff0c;该服务基于CQRS 和DDD来实…

[翻译] Entity Framework Core in Action 关于这本书

Entityframework Core in action是 Jon P smith 所著的关于Entityframework Core 书籍。原版地址. 是除了官方文档外另一个学习EF Core的不错途径, 书中由浅入深的讲解的EF Core的相关知识。因为没有中文版,所以本人对其进行翻译。 预计每两天一篇更新 PS: 翻译难免限于本人水平…

NC51189 Mondriaan‘s Dream

NC51189 Mondriaan’s Dream 题意&#xff1a; n * m的矩阵&#xff0c;用1 * 2和2 * 1的砖快密铺&#xff0c;问多少种方法&#xff1a; 题解&#xff1a; 方法1&#xff1a; 我们现在规定砖头的竖放的上部分为1&#xff0c;砖头的横放或者是竖放的下部分为0 我们每两层进…

《小团队构建大网站:中小研发团队架构实践》送书活动结果公布

截止到1月25日24&#xff1a;00&#xff0c;本次送书活动共收到75位同学参与回复&#xff0c;本次很多同学在看到活动的书十年IT老兵带你通过案例学架构&#xff0c;附C#代码&#xff0c;自行就到各大网络商店上购买了书&#xff0c;据反馈这个书很不错.下面把Top 2的留言截图给…

test6 3-21 2021省选模拟赛six

文章目录考试复盘rnglgpm考试复盘 第一题&#xff0c;乍一看期望&#xff0c;又不会做了&#xff0c;乍二看&#xff0c;暴力好像可以202020跑路&#xff0c;屁颠屁颠敲完死活过不了这个简单的样例&#xff1b;开始(⊙⊙?)乍三看&#xff0c;实数&#xff1f;&#xff1f;完了…

如何为 .NET Core CLI 启用 TAB 自动补全功能

Intro在 Linux 下经常可以发现有些目录/文件名&#xff0c;以及有些工具可以命令输入几个字母之后按 TAB 自动补全&#xff0c;最近发现其实 dotnet cli 也可以&#xff0c;从.NET Core 2.0 SDK 开始&#xff0c;NET Core CLI 支持 tab 自动补全。你如果已经装了 dotnet Core S…

P8215-[THUPC2022 初赛]分组作业【网络流】

正题 题目链接:https://www.luogu.com.cn/problem/P8215 题目大意 有2n2\times n2n个人&#xff0c;第2i−12\times i-12i−1和第2i2\times i2i个人一组&#xff0c;然后每个人可以选择愿不愿意合作&#xff0c;愿意需要付出cic_ici​代价&#xff0c;不愿意是did_idi​代价&…

.NET IdentityServer4实战-开篇介绍与规划

一.开篇寄语由于假期的无聊&#xff0c;我决定了一个非常有挑战性的活动&#xff0c;也就是在年假给大家带来一个基于OAuth 2.0的身份授权框架&#xff0c;它就是 IdentityServer4 &#xff0c;如果没有意外的话&#xff0c;一定可以顺利的写完的&#xff0c;如果两天写一篇的话…

test5 3-20 2021省选模拟赛five

考试复盘 第一题&#xff1f;&#xff1f;是个什么互动哦&#xff0c;直接乱来的(&#xffe3;&#xffe3;)σ…(&#xff3f;&#xff3f;)ノ&#xff5c;壁 第二题是前几天考过的&#xff0c;所以知道是polyapolyapolya&#xff0c;但是式子推到最后的二项式定理没推对&am…

微信小程序开发必看,《使用 .NET Core + DevOps 开发微信跨平台应用》,苏州.NET俱乐部课程分享...

【课程名称】《使用 .NET Core DevOps 开发微信跨平台应用》【老师介绍】苏震巍&#xff0c;苏州盛派网络CEO&#xff0c;微软最有价值专家&#xff08;MVP&#xff09;、微软 Ignite 技术大会讲师&#xff0c;Senparc.Weixin作者&#xff0c;《微信开发深度解析》等书作者。苏…

test 7 3-22 2021省选模拟赛seven

文章目录考试复盘人生赢家黑红兔考试复盘 T1T1T1 subtask1:n≤5subtask1:n\le 5subtask1:n≤5&#xff0c;暴搜点的颜色状态以及边的存在状态 对于一条连接相同颜色点的边&#xff0c;可要可不要&#xff0c;不会提供形态变化的贡献&#xff0c;2edge2^{edge}2edge dpdpdp&…

Shadow Properties之美(一)【Microsoft Entity Framework Core随笔】

最近在做公司的项目的时候&#xff0c;开始把部分程序迁移到EF Core&#xff0c;然后有了一些感触&#xff0c;趁着还没忘却&#xff0c;还是先记录下来。EF Core还在成长中&#xff0c;我写这个的时候&#xff0c;版本是2.2。如果对着已有的EF 5/6来说&#xff0c;还有很多功能…

E - Another Postman Problem FZU - 2038

E - Another Postman Problem FZU - 2038 题意&#xff1a; n个点通过n-1个边两两相连&#xff0c;每个边有权值&#xff0c;求对于每个点到其他点的距离和的总和 题解&#xff1a; 我们以下图中的1-2这条边为例子&#xff0c;1-2这条边一共计算了几次&#xff1f; 我们现在…

ASP.NET Core 3.0 项目开始“瘦身”

新的 ASP.NET Core 项目使用名为Microsoft.AspNetCore.App的综合包。该包也可以称为“ASP.NET Core 共享框架”&#xff0c;其背后的基本思想是&#xff0c;包括一个典型的应用程序所需要的所有东西。但是&#xff0c;如果看看该包的依赖项&#xff0c;对“需要”的定义看起来相…

一个.NET Core开发者的Linux入门学习笔记

用.NET Core开发也有一段时间了&#xff0c;但是由于工作原因一直都是在Windows系统上进行的开发&#xff0c;一直想学习Linux然后把.NET Core开发的程序跑在Linux上&#xff0c;然后把心得体会记录一下发布再博客园&#xff0c;奈何拖延症泛滥&#xff0c;所以只写过一篇《Cen…

一二三系列之状压DP——Max Correct Set(一)Neko Rules the Catniverse (Large Version)(二)Make It Ascending(三)

文章目录一&#xff1a;CF1463F二&#xff1a;CF1152F2三&#xff1a;CF1342F一&#xff1a;CF1463F Max Correct Set 有一个结论&#xff1a;以xyxyxy为周期排列填充一定是不劣于最后的答案的 令pxy,rn%ppxy,rn\%ppxy,rn%p ⌊np⌋\lfloor\frac{n}{p}\rfloor⌊pn​⌋出现次数为…

实用帖 | 使用Visual Studio开发.NET Core推荐设置

Visual Studio 一直是.NET程序员的好伙伴&#xff0c;如今虽然.NET Core的开发可以用VSCode等其他环境&#xff0c;但VS依旧有强大的优势。今天来介绍下如何让VS用得更顺手的技能Here We Go!⛷基本配置首先要搞清楚的一点是&#xff0c;并不是所有版本的Visual Studio都支持.NE…

P3642 [APIO2016]烟火表演(左偏树、函数)

解析 感觉是左偏树的神题了. 首先有一个比较显然的结论&#xff0c;一个合法的方案中&#xff0c;两个叶子到它们 lca\text{lca}lca 的距离必须相等. 考虑设计 dp\text{dp}dp &#xff1a; fi,xf_{i,x}fi,x​ 表示 iii 的子树中&#xff0c;所有叶子到它的距离为 xxx 的最小…

.NET Core IdentityServer4实战 第一章-入门与API添加客户端凭据

内容&#xff1a;本文带大家使用IdentityServer4进行对API授权保护的基本策略作者&#xff1a;zara(张子浩) 欢迎分享&#xff0c;但需在文章鲜明处留下原文地址。本文将要讲述如何使用IdentityServer4对API授权保护以及如何携带Token进行访问受保护的API&#xff0c;通过HttpC…

蒋金楠:200行代码7个对象《ASP.NET Core框架揭密》苏州.NET俱乐部课程分享

【课程名称】《ASP.NET Core框架揭密》【老师介绍】蒋金楠&#xff0c;同程艺龙机票事业部技术专家&#xff0c;微软最有价值专家&#xff08;MVP&#xff0c;连续12&#xff09;&#xff0c;多本.NET专著作者。博客园Artech&#xff0c;公众号“大内老A”。【课程简介】讲述AS…