唯一能得分的题也被自己搞炸了,好的。

考场上读完题基本认定和lca脱不了干系,想了一会确认是树剖。

那么问题来了,考前一节课刚发现自己之前打的树剖是错的。

而且就算是错的我也没信心考场调出来。

于是打了个自认为复杂度不高的暴力,T出天际,被各位不屑于打树剖的巨佬の向上标记干趴下。

考完翻书学了一下树上差分,赶脚不错。

树剖||Tarjan求lca+树上差分

后者的思路是预处理路线上每两个房间的lca

每次num[x]++,num[y]++,num[lca]++,num[father[lca]]++

最后进行一次dfs统计所有点的权值

int dfs(int x)
{
v[x]=1;int now=0;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(v[y])continue;
now+=dfs(y);
}
num[x]+=now;
return num[x];
}

最后num[way[1]]++

然后输出way[i]-1 (因为除了第一个点之外的每个点都算了两遍)

#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
const int N=300010;
int n;
int to[N<<1],nxt[N<<1],num[N],tot=0,fa[N],v[N],root,head[N],ans[N],way[N],father[N];
vector<int> q[N],qi[N];
void add(int x,int y)
{
to[++tot]=y;
nxt[tot]=head[x];
head[x]=tot;
}
void insq(int x,int y,int i)
{
q[x].push_back(y);
qi[x].push_back(i);
q[y].push_back(x);
qi[y].push_back(i);
}
int getf(int x)
{
if(x==fa[x])return x;
fa[x]=getf(fa[x]);
return fa[x];
}
void tarjan(int x)
{
v[x]=1;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(v[y])continue;
tarjan(y);
fa[y]=father[y]=x;
}
for(int i=0;i<q[x].size();i++)
{
int y=q[x][i],id=qi[x][i];
if(v[y]==2)ans[id]=getf(y);
}
v[x]=2;
}
int dfs(int x)
{
v[x]=1;int now=0;
for(int i=head[x];i;i=nxt[i])
{
int y=to[i];
if(v[y])continue;
now+=dfs(y);
}
num[x]+=now;
return num[x];
}
int main()
{
/*freopen("FU.in","r",stdin);
freopen("FU.out","w",stdout);*/
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&way[i]),fa[i]=i;
root=way[1];
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
x=way[i],y=way[i+1];
insq(x,y,i);
}
/*cout<<endl;
for(int i=1;i<=n;i++)cout<<father[i]<<' ';
cout<<endl;*/
tarjan(root);
memset(v,0,sizeof(v));
for(int i=1;i<n;i++)
{
int x=way[i],y=way[i+1],lca=ans[i];
num[x]++;num[y]++;num[lca]--;num[father[lca]]--;
}
dfs(root);
num[root]++;
for(int i=1;i<=n;i++)printf("%d\n",num[i]-1);
return 0;
}

题解 P3258 【[JLOI2014]松鼠的新家】(From luoguBlog)的更多相关文章

  1. 洛谷 P3258 [JLOI2014]松鼠的新家 题解

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  2. P3258 [JLOI2014]松鼠的新家

    P3258 [JLOI2014]松鼠的新家倍增lca+树上差分,从叶子节点向根节点求前缀和,dfs求子树和即可,最后,把每次的起点和终点都. #include<iostream> #inc ...

  3. 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  4. 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家

    [题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...

  5. 洛谷P3258 [JLOI2014]松鼠的新家

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  6. P3258[JLOI2014]松鼠的新家(LCA 树上差分)

    P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...

  7. 洛谷 P3258 [JLOI2014]松鼠的新家 树链剖分+差分前缀和优化

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 说明 思路 AC代码 优化 优化后AC代码 总结 题面 题目链接 P3258 [JLOI2 ...

  8. P3258 [JLOI2014]松鼠的新家题解

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有\(n\)个房间,并且有\(n-1\)根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在"树& ...

  9. 洛谷 P3258 [JLOI2014]松鼠的新家(树链剖分)

    题目描述松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前来 ...

  10. 洛谷P3258 [JLOI2014]松鼠的新家(树上差分+树剖)

    题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在”树“上. 松鼠想邀请小熊维尼前 ...

随机推荐

  1. 基于JavaScript封装的Ajax工具类

    前段是件由于工作需要无奈编写了一个给予JavaScript封装的工具类,技术有限,误喷,感谢大家的支持. 1.以下是JavaScript 的 Ajax 工具类. function createXMLH ...

  2. 联赛前集训日记Day1

    考试 炸的凄惨 T1 显然要高精搞一下,然而我的$DFS$竟然比我的$O(n^{2})$递推快 T2 欧拉路径的题,很不可做的样子,就没敢费时间打 T3 $DFS$枚举可过,然而我太蠢 GG 刷题 改 ...

  3. [COGS 2264]魔法传输

    [COGS 2264]魔法传输 题目 自从看了<哈利波特>,小Y就十分渴望获得魔法值.于是他和一群向往魔法的孩子(当然这些孩子们都是不会魔法的)来到了哈利波特的家,大家坐成一排.哈利波特会 ...

  4. noip模拟赛 fateice-or

    分析:or操作只有在结果的这一位为0的情况下才会强制要求两个数的这一位都为0,其它时候不强求,所以为了最大限度地满足条件,我们先把所有的数的所有位全部变成1,如果p的第i位为0,那么[l,r]的数的第 ...

  5. POJ 1190 生日蛋糕 剪枝

    Description 7月17日是Mr.W的生日,ACM-THU为此要制作一个体积为Nπ的M层生日蛋糕,每层都是一个圆柱体. 设从下往上数第i(1 <= i <= M)层蛋糕是半径为Ri ...

  6. JQuery获取select选中值和清除选中状态(转)

    1.获取值 var provinceSearch = $("#loc_province_search").find("option:selected").att ...

  7. 微信 创建自定义菜单 向微信发起的post请求

    微信 创建自定义菜单 向微信发起的post请求 Map<String, Object> res = new HashMap<String, Object>(); try { S ...

  8. PHP发展的现状和前景

    本人小菜鸟一仅仅,为了自我学习和交流PHP(jquery,linux,lamp,shell,javascript,server)等一系列的知识.小菜鸟创建了一个群. 希望光临本博客的人能够进来交流.寻 ...

  9. 使用Memcached改进Java企业级应用性能:架构和设置

    Memcached由Danga Interactive开发.用来提升LiveJournal.com站点性能. Memcached分布式架构支持众多的社交网络应用,Twitter.Facebook还有W ...

  10. Python3.4 远程操控电脑(开关机)

    import poplib import sys import smtplib from email.mime.text import MIMEText import os from email.he ...