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. 图文列表,关于Simpleadapter

    main.xml: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  2. Docker的Mysql数据库:把数据存储在本地目录

    Docker mysql 把数据存储在本地目录,很简单,只需要映射本地目录到容器即可 1.加上-v参数 $ docker run -d -e MYSQL_ROOT_PASSWORD=admin --n ...

  3. 感言&2

    我写下这些,不是为了向谁诉说我的苦难,我家庭的苦难,而只是想说,朋友,当你们能够坐在星巴克里点杯咖啡打开Macbook刷知乎,思考“人为什么努力”这样的问题时有无数个像我一样出身的孩子在拼命,不因为什 ...

  4. springboot mybatis 后台框架平台 集成代码生成器 shiro 权限

    1.代码生成器: [正反双向](单表.主表.明细表.树形表,快速开发利器)freemaker模版技术 ,0个代码不用写,生成完整的一个模块,带页面.建表sql脚本.处理类.service等完整模块2. ...

  5. kettle学习笔记(一)——入门与安装

    一.概述 1.kettle是什么 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,绿色无需安装,数据抽取高效稳定.中文名称叫水壶,该项目的主程序 ...

  6. 如何判断Android设备是否为模拟器

    android.os.Build.BRAND:获取设备品牌 如果获取的Landroid/os/Build;->BRAND的值为 "generic"则为模拟器上运行. andr ...

  7. Java通过pinyin4j实现汉字转拼音

       碰到个需求,需要按用户名字的首字母来排序.这就需要获取汉字对应的拼音了,突然就想起了pinyin4j这个jar包,于是就开始写了个汉字转拼音的工具类.在此记录一下,方便后续查阅 一.Pom依赖 ...

  8. Hadoop日记Day6---Linux的常用命令

    一.系统操作(开机.关机.登陆等)命令 选项名称 使用格式 含义 reboot 输入回车即可 立刻重启 shutdown shutdown –r   now 立刻重启 shutdown –r  20: ...

  9. docker之私有仓库镜像管理

    一.查看本地镜像 二.给镜像打标记(tag ) [root@node03 ~]# docker tag wordpress:v1 192.168.1.197:5000/wordpress:v1 2.删 ...

  10. 1065 A+B and C

    同样是一题会产生溢出的题,不同的是这个用大数类很麻烦,因为有负数的可能性 不妨利用溢出的特性来解题:两个整数和为负数 或者 两个负数和为正数,那么就溢出了. #include<bits/stdc ...