bzoj4543. [POI2014]Hotel加强版

bzoj4543. [POI2014]Hotel加强版

题面描述

Solution

先看n≤5e3n \leq 5e3n5e3怎么做。
考虑树形dpdpdp

f[i][j]f[i][j]f[i][j]表示以iii为根的子树中,深度为jjj的结点个数。
g[i][j]g[i][j]g[i][j]表示以iii为根的子树中的二元组(x,y)(x,y)(x,y)数量,其中(x,y)(x,y)(x,y)满足x,yx,yx,yLCALCALCAiii的距离为jjj

显然答案有两种情况:
1.中心点不是其中一个点的祖先。
2.三个点的中心点是这三个点的祖先。
对于第一种,总答案即为∑xg[x][0]\sum_{x}g[x][0]xg[x][0]
对于第二种,考虑每次转移时加入一个子树vvv,对答案的贡献即为∑f[x][j−1]∗g[v][j]+g[x][j+1]∗f[v][j]\sum f[x][j-1]*g[v][j]+g[x][j+1]*f[v][j]f[x][j1]g[v][j]+g[x][j+1]f[v][j],然后分别转移f[x],g[x]f[x],g[x]f[x],g[x]即可。

直接维护的时空复杂度都为O(n2)O(n^2)O(n2)

因为这一题的时空复杂度都和深度有关,直接长链剖分维护f[x],g[x]f[x],g[x]f[x],g[x]优化,就优化为O(n)O(n)O(n)了。

#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <cassert>
#include <string.h>
//#include <unordered_set>
//#include <unordered_map>
//#include <bits/stdc++.h>#define MP(A,B) make_pair(A,B)
#define PB(A) push_back(A)
#define SIZE(A) ((int)A.size())
#define LEN(A) ((int)A.length())
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define fi first
#define se secondusing namespace std;template<typename T>inline bool upmin(T &x,T y) { return y<x?x=y,1:0; }
template<typename T>inline bool upmax(T &x,T y) { return x<y?x=y,1:0; }typedef long long ll;
typedef unsigned long long ull;
typedef long double lod;
typedef pair<int,int> PR;
typedef vector<int> VI;const lod eps=1e-11;
const lod pi=acos(-1);
const int oo=1<<30;
const ll loo=1ll<<62;
const int mods=998244353;
const int MAXN=310005;
const int INF=0x3f3f3f3f;//1061109567
/*--------------------------------------------------------------------*/
inline int read()
{int f=1,x=0; char c=getchar();while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f;
}
vector<int> e[MAXN];
int len[MAXN],mx[MAXN];
ll a[MAXN<<2],*f[MAXN],*g[MAXN],*id=a,ans=0;
void dfs(int x,int father)
{len[x]=1;for (auto v:e[x]){if (v==father) continue;dfs(v,x);if (len[x]<len[v]+1) len[x]=len[v]+1,mx[x]=v;}
}
void tree_dp(int x,int father)
{if (mx[x]) f[mx[x]]=f[x]+1,g[mx[x]]=g[x]-1,tree_dp(mx[x],x);f[x][0]=1,ans+=g[x][0];for (auto v:e[x]){if (v==father||v==mx[x]) continue;f[v]=id,id+=len[v]<<1;g[v]=id,id+=len[v]<<1;tree_dp(v,x);for (int j=0;j<len[v];j++){if (j) ans+=f[x][j-1]*g[v][j];ans+=g[x][j+1]*f[v][j];}for (int j=0;j<len[v];j++){g[x][j+1]+=f[x][j+1]*f[v][j];if (j) g[x][j-1]+=g[v][j];f[x][j+1]+=f[v][j];}}
}
int main()
{int n=read();for (int i=1;i<n;i++){int u=read(),v=read();e[u].PB(v);e[v].PB(u);}dfs(1,0);
//	for (int i=1;i<=n;i++) cout<<i<<":"<<mx[i]<<endl;f[1]=id,id+=len[1]<<1;g[1]=id,id+=len[1]<<1;tree_dp(1,0);
//	for (int i=1;i<=n;i++)
//	{
//		cout<<i<<":"<<len[i]<<endl;
//		for (int j=0;j<=len[j];j++) cout<<f[i][j]<<" "; puts("");
//		for (int j=0;j<=len[j];j++) cout<<g[i][j]<<" "; puts("");
//	}printf("%lld\n",ans);return 0;
}

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

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

相关文章

Web Template Studio 发布!在 VS Code 中轻松创建 Web 应用

作为一个 Web 应用开发者&#xff0c;Scaffolding Tool&#xff08;脚手架工具&#xff09;一定是在创建项目时的重要工具。许多开发者会习惯于使用基于 CLI 的脚手架工具来创建 Web 应用&#xff0c;也有许多开发者喜欢使用类似于 VS IDE 的基于 UI 的 Wizard 向导。近期&…

AGC022E - Median Replace

AGC022E - Median Replace 题面描述 Solution 直接构造自动机&#xff0c;模拟每次在末尾加一个字符的当前状态的方案数f[state]f[state]f[state]&#xff0c;状态很少&#xff0c;直接打表转移即可。 时间复杂度O(n)O(n)O(n)。 #include <vector> #include <lis…

再多迷茫,不如静下来好好学习

背景前不久&#xff0c;我有幸看到了CSDN知名博主“沉默王二”写的一篇博客《你的青春&#xff0c;值得先给小型创业公司吗&#xff1f;》&#xff0c;这篇博客介绍了他从苏州回到内地小城洛阳之后&#xff0c;虽然远离了互联网的主阵地&#xff0c;但是依然保持学习的态度&…

AGC023D - Go Home

AGC023D - Go Home 题目描述 Solution 我们首先把这些人分成在sss左边和在sss右边两类&#xff0c;考虑最左边的一群人AAA和最右边的一群人BBB&#xff0c;这两群人中必然有其中一群人是最后到家的。而是否最后到家取决于这两群人的人数&#xff08;因为倘若只剩下两群人&am…

Web API 速率限制(二)- 令牌桶算法简介

前情提要上一篇文章里简单介绍了什么是Web API的速率限制&#xff0c;和限速策略需考虑的问题&#xff0c;最后还介绍了ASP.NET Core 的一个常用限速库。。。。。。。的名字。实施策略如果你想要建立一个限速系统&#xff0c;首先要确保限速系统不会增加API的响应时间。为了保证…

AGC023F - 01 on Tree

AGC023F - 01 on Tree 题目描述 Solution 有一个奇妙的贪心思路。&#xff08;奇妙的原因是我不会证&#xff09; 这一题的结点需要按拓扑序排序&#xff0c;并让逆序对个数最小。 考虑在儿子向父亲合并的过程中统计答案&#xff0c;产生的逆序对个数就是cnt[father][1]∗cn…

让 Ocelot 与 asp.net core “共存”

Intro我们的 API 之前是一个单体应用&#xff0c;各个模块的服务是通过 Assembly 集成在一起&#xff0c;最后部署在一个 web server 下的。我们已经在拆分服务并且在 Ocelot 的基础上封装了我们自己的网关&#xff0c;但是服务还没有完全拆分&#xff0c;于是有这么一个需求&a…

AGC024E - Sequence Growing Hard

AGC024E - Sequence Growing Hard 题目描述 Solution 我们可以把问题看成如下形式&#xff1a; 你有一个空序列&#xff0c;每次要加入一个元素xxx,x∈[1,k]x \in [1,k]x∈[1,k]&#xff0c;使得新的序列字典序比上一个序列的字典序大。 显然如果我们加入一个数xxx&#xf…

Xamarin中国峰会2019

Xamarin跨平台技术中国峰会将讨论Xamarin技术的国内最新发展和实践情况&#xff0c;在会议中领略现代化的开发模式、应用基础架构、企业应用转型和案例交流。本月26日&#xff0c;Xamarin中国峰会将以线上直播的形式和大家见面&#xff01;直播时间:2019年5月26日 8:00—17:00直…

博弈论练习1

博弈论练习1 \;1.ProjectEuler306 Paper-strip Game 题目描述 Solution 令SG[i]SG[i]SG[i]表示连续iii个格子的SGSGSG值。 SG[0]SG[1]0SG[i]mexj0n−2{SG[j]xorSG[i−j−2]}SG[0]SG[1]0 \\ SG[i]mex_{j0}^{n-2}\{SG[j]\;\;xor\;\;SG[i-j-2]\} SG[0]SG[1]0SG[i]mexj0n−2​{S…

.NET Core IoT 入门指南:(三)使用 I2C 进行通信

什么是 I2C 总线I2C 总线&#xff08;Inter-Integrated Circuit Bus&#xff09;是设备与设备间通信方式的一种。它是一种串行通信总线&#xff0c;由飞利浦公司在1980年代为了让主板、嵌入式系统或手机用以连接低速周边设备而发展[1]。I2C 总线包含两根信号线&#xff0c;一根…

圆方树

圆方树 单纯贴个板子。。。 https://loj.ac/problem/2587 #include <vector> #include <list> #include <map> #include <set> #include <deque> #include <queue> #include <stack> #include <bitset> #include <algor…

浅淡Kubernetes 与容器技术体系的最佳方法

我们已经进入到容器化时代&#xff0c;Kubernetes成为了市场上容器编排的事实标准&#xff0c;而且k8S 同样具备了微服务所需要的服务注册与发现、负载均衡、配置中心。Spring cloud 的核心是Netflix微服务框架&#xff0c;非常成熟&#xff0c;但是在netflix oss开发初期&…

单位根反演题单

单位根反演题单 LOJ#6485. LJJ 学二项式定理 单位根反演。 bzoj 3328 PYXFIB 单位根反演矩阵乘法。 POJChallengeRound2 Guideposts 求图上路径长度为k的倍数的方案数。 单位根反演矩阵乘法。 #include <vector> #include <list> #include <map> #inc…

.NET Core 批量重置 Azure Blob Storage 的 mime type

点击上方蓝字关注“汪宇杰博客”我的博客使用 Azure Blob Storage 存储文章配图&#xff0c;结果今天玩 Azure CDN 的时候爆了&#xff0c;原因是图片mime type不对。我们来看看如何在 .NET Core 里批量重置 Azure Blob Storage 中文件的mime type吧。起因使用编程方式&#xf…

AGC026E - Synchronized Subsequence

AGC026E - Synchronized Subsequence 题目描述 Solution 定义cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]cnt[x][0],cnt[x][1]表示在前xxx个数中0的个数和1的个数分别是多少。 然后把整个串sss划分为若干个子串&#xff0c;划分点在所有cnt[i][0]cnt[i][1]cnt[i][0]cnt[i][1]c…

[NewLife.XCode]实体工厂(拦截处理实体操作)

NewLife.XCode是一个有10多年历史的开源数据中间件&#xff0c;支持nfx/netcore&#xff0c;由新生命团队(2002~2019)开发完成并维护至今&#xff0c;以下简称XCode。整个系列教程会大量结合示例代码和运行日志来进行深入分析&#xff0c;蕴含多年开发经验于其中&#xff0c;代…

AGC027D - Modulo Matrix

AGC027D - Modulo Matrix 题目描述 Solution 有一个显然的想法是先填一部分格子&#xff0c;剩下的格子的即为相邻格子的LCM1LCM1LCM1&#xff0c;但这样填写的数呈指数级增长&#xff0c;并不优秀。 我们发现一个格子的数是否可以填写只和相邻的四个格子有关系&#xff0c…

DDD该怎么学

2006年&#xff0c;国内的互联网才刚刚萌芽&#xff0c;人们甚至还不习惯网购&#xff0c;大多数在校生都在宿舍里刷魔兽世界副本。但企业软件开发却得到了蓬勃发展&#xff0c;各种公司和事业单位都纷纷进行信息化转型。然而人们很快发现&#xff0c;企业应用业务逻辑的复杂度…

博弈论练习2

博弈论练习2 \;1.AGC010F - Tree Game 题目描述 Solution 一道简单博弈题&#xff08;不知道为啥能作为AGC的F题&#xff09;。 考虑树形dpdpdp&#xff0c;设f[x]f[x]f[x]表示以xxx为根的子树中是否先手必胜。 则f[x]1f[x]1f[x]1当且仅当能找到xxx的子节点vvv满足f[v]0f[v…