Description

天使立华奏攻入了死后世界战线(SSS)的地下工会Guild,这是万分危急的时候。仲村由理指挥工会成员有条不紊地进行撤退工作。工会成员在Guild最深层工厂安放炸药需要很长的准备时间,需要有人来拖延立华奏的前进速度。但是他们并不清楚立华奏的具体位置,因此他们需要设立许多个防御点。
Guild的结构可以看成一棵有n 个节点的树,有时由理会得到立华奏的大概位置,可能在某两棵子树的任意一棵中,她就会找到Guild树(不一定要在两棵子树内)上的一个点,使得该点到两棵子树中所有点距离之和最小,即这两棵子树的重心(如果两棵子树有重合部分,那么取它们并集求重心)。
具体而言,你会得到Guild的结构(1为根),然后会有q个询问,向你查询点x子树和点y子树的重心,重心可能会有很多个,你只需要输出距离和即可。

Solution

crazy_czy很喜欢这部番……卖广告
看到这题很懵逼啊,一个点x到他所在的子树y的所有节点的距离和怎么求,这个很简单,正难则反:
子树所有点到x距离和=所有点到x距离和−非子树所有点到x距离和 子树所有点到x距离和=所有点到x距离和-非子树所有点到x距离和
=所有点到x距离和−非子树所有点到子树根距离和−(n−子树大小)×dist(x,y) =所有点到x距离和-非子树所有点到子树根距离和-(n-子树大小)× dist(x, y)
=所有点到x距离和−(所有点到子树根距离和−子树所有点到子树根距离和)−(n−子树大小)×dist(x,y) =所有点到x距离和-(所有点到子树根距离和-子树所有点到子树根距离和) -(n-子树大小)× dist(x, y)
但是现在问题来了,怎么预处理出每个子树的重心?????
然后我这题就爆零了。
crazy_czy用了一大堆性质给我们讲。
结论1:两棵子树的重心一定在两棵子树各自重心连线的路径上。 结论 1:两棵子树的重心一定在两棵子树各自重心连线的路径上。
结论2:在两棵子树size较大那棵内部一定能找到两棵子树重心。 结论 2:在两棵子树size较大那棵内部一定能找到两棵子树重心。
结论2的推论:对于一个点x,令其size最大儿子为y,如果size(x)−1−size(y)≥size(y),那么子树x的重心一定为x,否则就一定在点y的子树内 结论 2 的推论:对于一个点x,令其size最大儿子为y,如果size(x)-1− size(y) ≥ size(y),那么子树x的重心一定为x,否则就一定在点y的子树内
结论2的推论证明十分的机制,因为如果size(x)-size(y)-1≥size(y),就说明重心不在最大的那个子数里面而在其他的子树的集合里面,那么最大的子树不符合,其他任意的子树也是同样的情况,那么最后所有子树集合的交际就是根节点x。
虽然知道了这些,代码———-
但是还是搞了很久,当时我向上倍增找重心一直找错,后来改了个巧妙的倍增。
本来倍增我存了很多什么最小值啊,位置啊之内的,然后其实每次倍增满足

    size[y]-size[f[x][i]]>size[y]/2&&deep[f[x][i]]>deep[y]

这段东西就可以了,然后

if(size[y]-size[f[x][0]]<=size[y]/2&&size[big[f[x][0]]]<=size[y]/2)return f[x][0];return x;

在往上跳一位就是重心了。
表示调了好久……

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fod(i,a,b) for(i=a;i>=b;i--)
#define rep(i,a) for(i=first[a];i;i=next[i])
using namespace std;
const int maxn=100007;
int i,j,k,l,t,n,m,ans;
int first[maxn*2],next[maxn*2],last[maxn*2],num,bb,cc;
int f[maxn][21],deep[maxn],g[maxn][21],size[maxn],zhong[maxn],big[maxn],wei[maxn][21],sum[maxn],zs[maxn];
void add(int x,int y){last[++num]=y;next[num]=first[x];first[x]=num;last[++num]=x;next[num]=first[y];first[y]=num;
}
/*int lca(int x,int y){bb=0x7fffffff;cc=0;int i;if(deep[x]<deep[y])swap(x,y);fod(i,20,0)if(deep[f[x][i]]>deep[y])cc=(g[x][i]<bb)?wei[x][i]:cc,bb=min(bb,g[x][i]),x=f[x][i];if(deep[x]!=deep[y])cc=(g[x][0]<bb)?wei[x][0]:cc,bb=min(bb,g[x][i]),x=f[x][0];fod(i,20,0)if(f[x][i]!=f[y][i])cc=(g[x][i]<bb)?wei[x][i]:cc,bb=min(g[x][i],bb),cc=(g[y][i]<bb)?wei[y][i]:cc,bb=min(g[y][i],bb),x=f[x][i],y=f[y][i];if(x!=y)cc=(g[x][0]<bb)?wei[x][0]:cc,bb=min(g[x][0],bb),cc=(g[y][0]<bb)?wei[y][0]:cc,bb=min(g[y][0],bb);if(x!=y)return f[x][0];return x;
}*/
int lca(int x,int y){int i,k=0x7fffffff;if(deep[x]<deep[y])swap(x,y);fod(i,20,0)if(deep[f[x][i]]>deep[y])bb=(g[x][i]<k?wei[x][i]:bb),k=min(k,g[x][i]),x=f[x][i];    if(deep[x]!=deep[y])bb=(g[x][0]<k?wei[x][0]:bb),k=min(k,g[x][0]),x=f[x][0];fod(i,20,0)if(f[x][i]!=f[y][i])bb=(g[x][i]<k?wei[x][i]:bb),k=min(k,g[x][i]),bb=(g[y][i]<k?wei[y][i]:bb),k=min(k,g[y][i]),x=f[x][i],y=f[y][i];if(x!=y)bb=(g[x][0]<k?wei[x][0]:bb),k=min(k,g[x][0]),bb=(g[y][0]<k?wei[y][0]:bb),k=min(k,g[y][0]);if(x!=y)return f[x][0];else return x;
}
int bei(int x,int y){int i,k=0x7fffffff;if(deep[x]<deep[y])swap(x,y);fod(i,20,0)if(size[y]-size[f[x][i]]>size[y]/2&&deep[f[x][i]]>deep[y])x=f[x][i];if(size[y]-size[f[x][0]]<=size[y]/2&&size[big[f[x][0]]]<=size[y]/2/*&&deep[f[x][0]]>deep[y]*/)return f[x][0];return x;
}
void dfs(int x,int y){int i,k=0;deep[x]=deep[y]+1;size[x]=1;sum[1]+=deep[x]-1;if(x==38){ans=ans;}rep(i,x){if(last[i]!=y){dfs(last[i],x);size[x]+=size[last[i]];if(size[last[i]]>k){k=size[last[i]];big[x]=last[i];}zs[x]+=zs[last[i]]+size[last[i]];}}
}
void dfs1(int x,int y){int i,o=n-size[x];g[x][0]=sum[x];wei[x][0]=x;if(x==38){ans=ans;}rep(i,x){if(last[i]!=y){sum[last[i]]=sum[x]+(n-size[last[i]])-size[last[i]];dfs1(last[i],x);}}
}
void fh(int x,int y){int i,o=n-size[x];rep(i,x){if(last[i]!=y){fh(last[i],x);}}if(size[x]==1){zhong[x]=x;return;}if(x==38){ans=ans;}if(size[big[x]]<=size[x]-size[big[x]]-1)zhong[x]=x;else{/*  if(size[x]-size[zhong[big[x]]]<=size[x]/2){zhong[x]=zhong[big[x]];}else{*/int o=bei(zhong[big[x]],x);zhong[x]=o;        //    }}
}
int suan(int x,int y){int o=0;o=sum[x]-(sum[y]-zs[y])-(n-size[y])*(deep[x]-deep[y]);
}
int main(){
//  freopen("fan.out","w",stdout);scanf("%d",&n);fo(i,2,n){scanf("%d",&f[i][0]);add(f[i][0],i);}dfs(1,0);memset(g,127,sizeof(g));dfs1(1,0);fo(j,1,20){fo(i,1,n){f[i][j]=f[f[i][j-1]][j-1];wei[i][j]=(g[i][j-1]<g[f[i][j-1]][j-1])?wei[i][j-1]:wei[f[i][j-1]][j-1];g[i][j]=min(g[i][j-1],g[f[i][j-1]][j-1]);}}fh(1,0);for(scanf("%d",&m);m;m--){scanf("%d%d",&k,&l);int o=lca(k,l);int u=deep[k]-2*deep[o]+deep[l];int ss=size[k]+size[l];if(size[k]<size[l])swap(k,l);if(k==o)ss=size[k];int z=zhong[k];fod(i,20,0)if(ss-size[f[z][i]]>ss/2&&deep[f[z][i]]>deep[k])z=f[z][i];if(ss-size[f[z][0]]<=ss/2&&size[big[f[z][0]]]<=ss/2/*&&deep[f[z][0]]>=deep[k]&&deep[f[z][0]]>deep[o]*/)z=f[z][0];if(k==o)ans=suan(z,k);else ans=suan(z,k)+(u+deep[z]-deep[k])*size[l]+zs[l];printf("%d\n",ans);}
}

【NOIP模拟】Angel Beats!相关推荐

  1. NOI.AC NOIP模拟赛 第六场 游记

    NOI.AC NOIP模拟赛 第六场 游记 queen 题目大意: 在一个\(n\times n(n\le10^5)\)的棋盘上,放有\(m(m\le10^5)\)个皇后,其中每一个皇后都可以向上.下 ...

  2. 【noip模拟赛4】Matrix67的派对 暴力dfs

    [noip模拟赛4]Matrix67的派对 描述 Matrix67发现身高接近的人似乎更合得来.Matrix67举办的派对共有N(1<=N<=10)个人参加,Matrix67需要把他们安排 ...

  3. 【HHHOJ】NOIP模拟赛 捌 解题报告

    点此进入比赛 得分: \(30+30+70=130\)(弱爆了) 排名: \(Rank\ 22\) \(Rating\):\(-31\) \(T1\):[HHHOJ260]「NOIP模拟赛 捌」Dig ...

  4. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  5. jyzy noip模拟赛5.22-2

    不知道哪来的题 jyzy noip模拟赛5.22-2 样例输入 1 2 3 4 样例输出 0.200000000000000 数据 |a|,|b|,|c|,|d|<=1e9 很多大佬迅速想到二分 ...

  6. NOIP模拟赛csy2021/10/30

    NOIP模拟赛csy2021/10/30 比赛时间规划 赛后反思与总结 这..总的来说感觉打的很不好,根本没有状态,有一部分原因是今天来晚了,太慌,更多的还是这次题感觉很难o(╥﹏╥)o 比赛时间规划 ...

  7. Angel Beats,AFOer Beats?

    意识模糊的时候适合写一些奇怪的东西? NOI退役之后我尝试了很多方法调节心态.(比如做OI题,出OI题,学文化课,读书,吃饭,睡觉,水群,看番,推galgame). 然而看啥都是退役的画风.比如说推W ...

  8. NOIP模拟(10.22)T2 杆子的排列

    杆子的排列 题目背景: 10.22 NOIP模拟作业T2 分析:DP 定义状态dp[i][j][k]表示,目前枚举到第i大的数(即n - i + 1)那么显然如果这一个数放在左边,可以在左边被看到,放 ...

  9. Noip 模拟练习5

    Noip 模拟练习5 满分300,本人240.修正后300. 难度中等. 太空密码 Description 人类一直致力于探索地外文明,为此科学家们建造了一个巨大的射电望远镜 用于接收宇宙射线.一天从 ...

  10. JZOJ 4639 Angel Beats!【NOIP2016提高组A组7.16】

    #Angel Beats! ##题目大意 给你一棵1为根的树,然后会有q个询问,向你查询点x子树和点y子树的重心,重心可能会有很多个,你只需要输出距离和即可. 两棵子树的重心的定义如下:在树上找到一个 ...

最新文章

  1. SpringBoot 注解方式快速整合Mybatis
  2. The following packages will be SUPERCEDED by a higher-priority channel
  3. 机器人越像人越好?Science子刊:被人形机器人一直盯着,你会变「蠢」
  4. php mysql 配置
  5. boost::graph::distributed::distributed_queue用法的测试程序
  6. PHP的composer安装问题
  7. linux7安装pgsql数据库,CentOS7下PostgreSQL安装
  8. 有人WIFI模块使用详解
  9. 使用uddi sdk发布服务到UDDI时的安全配置
  10. 软件案例分析-音乐软件界的卧龙凤雏-酷狗音乐与网易云音乐
  11. C语言判断逆反素数,判断素数的几种方法思考[C语言]
  12. Android 友盟分享自定义面板使用
  13. 现金红包、裂变红包、企业付款
  14. 无家可归的iPhone(第2部分)
  15. CS224d: Deep Learning for NLP Lecture1 听课记录
  16. windows下python如何安装模块或包? How to install package or module in windows OS when using PYTHON?
  17. Linux下Rsync+sersync实现数据实时同步
  18. 2022年TIOBE指数排行,Python位居榜首
  19. 1617_MIT 6.828 JOS boot代码分析
  20. cmos是微型计算机主板上一块特殊的,识别计算机主板上的BIOS芯片

热门文章

  1. 让我们一起携手冲刺!--写在北京奥运会倒计时一周年之际
  2. oracle中的select into,oracle 中select into是什么意思
  3. 对话设计黑客社区架构师Shadow#MiX-Talk 001
  4. 解决Vmware虚拟机无法打开Ubuntu的问题
  5. 基于Linux的C++轻量级web服务器/webserver/httpserver
  6. zico图标系统1.4版发布-更加优秀的图标引用与设计创作平台
  7. 洞察 | 软件定义汽车时代下,汽车制造产业的应对策略
  8. 医学影像领域内的3D转4D数据
  9. ENJ2005-C功率器件图示系统
  10. 2020年DeFi行业观察:交易型DeFi格局初定,下一战场是数据型、商品型与游戏型DeFi...