Description

同OJ3522

数据范围:n<=100000

Solution

dp的设计见【刷题】BZOJ 3522 [Poi2014]Hotel

然后发现dp的第二维与深度有关,于是长链剖分就可以优化成 \(O(n)\) 的了

不会写指针,所以写deque

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
#define REP(a,b,c) for(register int a=b,a##end=c;a<=a##end;++a)
#define DEP(a,b,c) for(register int a=b,a##end=c;a>=a##end;--a)
const int MAXN=100000+10;
int n,e,to[MAXN<<1],nex[MAXN<<1],beg[MAXN],dep[MAXN],Mxdep[MAXN],hson[MAXN],top[MAXN],id[MAXN],cnt;
ll ans;
std::deque<int> f[MAXN],g[MAXN];
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
inline void insert(int x,int y)
{
to[++e]=y;
nex[e]=beg[x];
beg[x]=e;
}
inline void dfs1(int x,int p)
{
dep[x]=dep[p]+1;Mxdep[x]=dep[x];hson[x]=x;
for(register int i=beg[x];i;i=nex[i])
if(to[i]==p)continue;
else
{
dfs1(to[i],x);
if(Mxdep[to[i]]>Mxdep[x])Mxdep[x]=Mxdep[to[i]],hson[x]=to[i];
}
}
inline void dfs2(int x,int p,int tp)
{
top[x]=tp;
if(hson[x]!=x)dfs2(hson[x],x,tp);
for(register int i=beg[x];i;i=nex[i])
if(to[i]==p||to[i]==hson[x])continue;
else dfs2(to[i],x,to[i]);
}
inline void dfs(int x,int p)
{
if(hson[x]==x)
{
id[x]=++cnt;
f[id[x]].resize(dep[x]-dep[top[x]]+1);
g[id[x]].resize(dep[x]-dep[top[x]]+1);
f[id[x]][0]=1;
return ;
}
dfs(hson[x],x);
id[x]=id[hson[x]];
f[id[x]].push_front(1);f[id[x]].pop_back();
g[id[x]].push_back(0);g[id[x]].pop_front();
ans+=g[id[x]][0];
for(register int i=beg[x];i;i=nex[i])
if(to[i]==p||to[i]==hson[x])continue;
else
{
dfs(to[i],x);
REP(j,0,Mxdep[to[i]]-dep[to[i]]+1)
{
ans+=f[id[x]][j]*g[id[to[i]]][j+1]+(j?f[id[to[i]]][j-1]*g[id[x]][j]:0);
g[id[x]][j]+=g[id[to[i]]][j+1]+(j?f[id[x]][j]*f[id[to[i]]][j-1]:0);
if(j)f[id[x]][j]+=f[id[to[i]]][j-1];
}
while(!f[id[to[i]]].empty())f[id[to[i]]].pop_back();
while(!g[id[to[i]]].empty())g[id[to[i]]].pop_back();
}
}
int main()
{
read(n);
REP(i,1,n-1)
{
int u,v;read(u);read(v);
insert(u,v);insert(v,u);
}
dfs1(1,0);dfs2(1,0,1);dfs(1,0);
write(ans,'\n');
return 0;
}

【刷题】BZOJ 4543 [POI2014]Hotel加强版的更多相关文章

  1. BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)

    题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...

  2. bzoj 4543: [POI2014]Hotel加强版

    Description 给出一棵树求三元组 \((x,y,z)\,,x<y<z\) 满足三个点两两之间距离相等,求三元组的数量 Solution 考虑暴力 \(DP\) 设 \(f[i][ ...

  3. 4543: [POI2014]Hotel加强版

    4543: [POI2014]Hotel加强版 链接 分析: f[u][i]表示子树u内,距离u为i的点的个数,g[u][i]表示在子树u内,已经选了两个深度一样的点,还需要在距离u为i的一个点作为第 ...

  4. BZOJ3522&4543 [POI2014]Hotel加强版 长链剖分

    上上周见fc爷用长链剖分秒题 于是偷偷学一学 3522的数据范围很小 可以暴力枚举每个点作为根节点来dp 复杂度$O(n^2)$ 考虑令$f[x][j]$表示以$x$为根的子树内距离$x$为$j$的点 ...

  5. BZOJ4543 POI2014 Hotel加强版 【长链剖分】【DP】*

    BZOJ4543 POI2014 Hotel加强版 Description 同OJ3522 数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 4 ...

  6. 【BZOJ4543】[POI2014]Hotel加强版 长链剖分+DP

    [BZOJ4543][POI2014]Hotel加强版 Description 同OJ3522数据范围:n<=100000 Sample Input 7 1 2 5 7 2 5 2 3 5 6 ...

  7. BZOJ4543 [POI2014]Hotel加强版

    题意 有一个树形结构,每条边的长度相同,任意两个节点可以相互到达.选3个点.两两距离相等.有多少种方案? 数据范围:n<=100000 分析 参照小蒟蒻yyb的博客. 我们先考虑一个\(O(n^ ...

  8. bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...

  9. 【刷题】BZOJ 3522 [Poi2014]Hotel

    Description 有一个树形结构的宾馆,n个房间,n-1条无向边,每条边的长度相同,任意两个房间可以相互到达.吉丽要给他的三个妹子各开(一个)房(间).三个妹子住的房间要互不相同(否则要打起来了 ...

随机推荐

  1. Python开发简单爬虫

    简单爬虫框架: 爬虫调度器 -> URL管理器 -> 网页下载器(urllib2) -> 网页解析器(BeautifulSoup) -> 价值数据 Demo1: # codin ...

  2. 如何优雅的使用mybatis

    原文:https://blog.csdn.net/gebitan505/article/details/54929287 这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较 ...

  3. 20155204《网络对抗》Exp 6 信息搜集与漏洞扫描

    20155204<网络对抗>Exp 6 信息搜集与漏洞扫描 一.实验后回答问题 1.哪些组织负责DNS,IP的管理. 互联网名称与数字地址分配机构,简称ICANN机构,决定了域名和IP地址 ...

  4. 【调试】Core Dump是什么?Linux下如何正确永久开启?

    [调试]Core Dump是什么?Linux下如何正确永久开启?

  5. winform和wpf如何实现鼠标穿透的效果

    先看一下鼠标穿透的效果: 可以看到Form1这个程序虽然遮在了桌面的上面,但是我们还可以在窗体上点击桌面上的必应词典和网易邮箱大师,好像这个叫“Form1”的窗口被“穿透”一样. winform版本: ...

  6. 4.Xilinx RapidIO核详解

    转自https://www.cnblogs.com/liujinggang/p/10072115.html 一.RapidIO核概述 RapidIO核的设计标准来源于RapidIO Interconn ...

  7. 微信小程序之路由

    1. 路由方式 路由方式 触发时机 路由前页面 路由后页面 初始化 小程序打开的第一个页面 onLoad, onShow 打开新页面 调用 API wx.navigateTo 或使用组件 onHide ...

  8. 《Effective Java》学习笔记 —— 通用程序设计

    本章主要讨论局部变量.控制结构.类库.反射.本地方法的用法及代码优化和命名惯例. 第45条 将局部变量的作用域最小化 * 在第一次使用的它的地方声明局部变量(就近原则). * 几乎每个局部变量的声明都 ...

  9. 联想拯救者15-isk安装固态硬盘与系统迁移教程

    一.固态选择 首先知道拯救者15-ISK是m.2接口2280尺寸,支持PCIE协议NVMe接口标准.我加装的固态是HP EX900系列250G M.2 NVMe固态硬盘. 二.开盖安装 1.拯救者15 ...

  10. 面向 Kubernetes 编程: Kubernetes 是下一代操作系统

    转自:https://github.com/answer1991/articles/blob/master/Kubernetes-is-the-next-generation-os.md 摘要 此文章 ...