CF860E Arkady and a Nobody-men

类比LNOI2014 LCA那个题,其实树剖可以过。。。。(用树状数组区间加区间求和更快!)

巧妙的nlogn做法是:

blog~

(其实第二个式子有锅,应当再加上dep[fa[x]])

对于同一层的考虑处理lca问题

一定要排个序处理

dfs是处理树上顺序的有力武器!

按dfs从小到大,一个x的前面的所有点的lca深度单调不降

可以用一个单调栈维护,只用维护:最后的位置(宽度),深度(键值),代表的点

如果和栈顶的代表点的lca深度比栈顶的键值小,那么pop栈顶,等价于把些点合并!

详见代码:

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
#define pb push_back
#define solid const auto &
#define enter cout<<endl
#define pii pair<int,int>
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
namespace Modulo{
const int mod=;
int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
void inc(int &x,int y){x=ad(x,y);}
int mul(int x,int y){return (ll)x*y%mod;}
void inc2(int &x,int y){x=mul(x,y);}
int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
}
//using namespace Modulo;
namespace Miracle{
const int N=5e5+;
int n;
int fa[N][];
ll g[N];
struct node{
int nxt,to;
}e[N];
int hd[N],cnt;
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
int dfn[N],df;
int dep[N];
vector<int>mem[N];
int mx;
void dfs(int x,int d){
dep[x]=d;
mx=max(mx,d);
mem[d].pb(x);
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
dfs(y,d+);
}
}
struct po{
int id,pos,d;
po(){}
po(int ii,int dd,int pp){
id=ii;pos=pp;d=dd;
}
}sta[N];
int top;
ll calc(){
if(!top) return ;
return (ll)(sta[top].pos-sta[top-].pos)*sta[top].d;
}
int lca(int x,int y){
if(dep[x]<dep[y]) swap(x,y);
for(reg j=;j>=;--j){
if(dep[fa[x][j]]>=dep[y]) x=fa[x][j];
}
if(x==y) return x;
for(reg j=;j>=;--j){
if(fa[x][j]!=fa[y][j]) x=fa[x][j],y=fa[y][j];
}
return fa[x][];
}
void sol(vector<int>&v){
int o=;
top=;
ll val=;
for(solid x:v){
if(!o){
++top;sta[top]=po(x,,);
}
else{
while(){
int y=lca(sta[top].id,x);
if(dep[y]>=sta[top].d){
++top;sta[top]=po(x,dep[y],o);break;
}
val-=calc();
--top;
}
val+=calc();
g[x]+=val;
}
++o;
}
}
int main(){
rd(n);
int rt=;
for(reg i=;i<=n;++i){
rd(fa[i][]);if(fa[i][]==) rt=i;
else add(fa[i][],i);
}
dfs(rt,);
for(reg j=;j<=;++j){
for(reg i=;i<=n;++i){
fa[i][j]=fa[fa[i][j-]][j-];
}
}
for(reg i=;i<=mx;++i){
for(solid x:mem[i]) g[x]=g[fa[x][]]+i-;
sol(mem[i]);
reverse(mem[i].begin(),mem[i].end());
sol(mem[i]);
}
prt(g,,n);
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

LCA和dfs本身着关系,

这里利用的本质上是,两个点的lca就是dfs栈不断回溯后,第一次前进下来的点就是lca(分叉地方)

O(1)LCA也是利用这个性质

CF860E Arkady and a Nobody-men的更多相关文章

  1. cf860E Arkady and A Nobody-men (树剖)

    容易得出,如果我们按照深度一层一层地做,做完一层后,这层某个点的答案就是它的祖先们的子树大小(统计大小时不包括树根) 由于我太菜了不会别的方法,虽然N是5e5的,还是只好用一个树剖(树状数组降常数)水 ...

  2. 一句话题解&&总结

    CF79D Password: 差分.两点取反,本质是匹配!最短路+状压DP 取反是套路,匹配是发现可以把操作进行目的化和阶段化,从而第二次转化问题. 且匹配不会影响别的位置答案 sequence 计 ...

  3. 【CF860E】Arkady and a Nobody-men 长链剖分

    [CF860E]Arkady and a Nobody-men 题意:给你一棵n个点的有根树.如果b是a的祖先,定义$r(a,b)$为b的子树中深度小于等于a的深度的点的个数(包括a).定义$z(a) ...

  4. Things about single men that women hate

    Things about single men that women hate为何你俘获不了女神的心?If you listen in to a group of single women talki ...

  5. Men and women can't be 'just friends

    Men and women can't be 'just friends' Can heterosexual men and women ever be "just friends" ...

  6. C. Greedy Arkady

    kk people want to split nn candies between them. Each candy should be given to exactly one of them o ...

  7. 广告狂人第一至七季/全集Mad Men迅雷下载

    广告狂人 第一季 Mad Men Season 1 (2007) 本季看点:你是谁?你想要什么?你爱乾什么?这些都不重要,重要的是你怎么把东西卖出去.凡是了解纽约的人都知道,今天,在麦迪逊大道(Mad ...

  8. 好汉两个半第十二季/全集Two and a Half Men迅雷下载

    本季Two And A Half Men Season 12 (2014)看点:<好汉两个半>的“半个”是因为第一季播出时杰克年纪太小,只能算半个.故事就在这三个主角和他们周围的女人中发生 ...

  9. 好汉两个半第一季/全集Two And A Half Men迅雷下载

    第一季 Two and a Half Men Season 1 (2003)看点:Charlie是一个潇洒自由的单身汉,但正面临离婚危机的兄弟Alan带着儿子Jake的突然来访完全打乱了Charlie ...

随机推荐

  1. 【死磕Java并发】—–深入分析ThreadLocal

    ThreadLoacal是什么? ThreadLocal是啥?以前面试别人时就喜欢问这个,有些伙伴喜欢把它和线程同步机制混为一谈,事实上ThreadLocal与线程同步无关.ThreadLocal虽然 ...

  2. LinqToSQL4

    Join和GroupJoin的区别 List<Atable> ainfo = new List<Atable> { new Atable{ AId=1, AName=" ...

  3. linux环境下安装python3的方法(转)

    Linux 安装python3.7.0   我这里使用的时centos7-mini,centos系统本身默认安装有python2.x,版本x根据不同版本系统有所不同,可通过 python --V 或 ...

  4. go语言入门(7)面向对象编程

    1,概述     对于面向对象编程的支持Go 语言设计得非常简洁而优雅.因为, Go语言并没有沿袭传统面向对象编程中的诸多概念,比如继承(不支持继承,尽管匿名字段的内存布局和行为类似继承,但它并不是继 ...

  5. Caffe---Pycaffe转换均值文件:xxx_mean.binaryproto成为xxx_mean.npy

    Pycaffe转换均值文件:xxx_mean.binaryproto成为xxx_mean.npy 为什么需要mean.binaryproto转mean.npy? 使用Caffe的C++接口进行操作时, ...

  6. ajax的底层实现

    Ajax 技术核心是 XMLHttpRequest 对象(简称 XHR),这是由微软首先引入的一个特性,其他浏览器提供商后来都提供了相同的实现.在 XHR 出现之前,Ajax 式的通信必须借助一些手段 ...

  7. javascript弹出带文字信息的提示框效果

    // position of the tooltip relative to the mouse in pixel // <html><head><meta charse ...

  8. Pycharm建立web2py项目

    web2py是一种免费的,开源的web开发框架,用于敏捷地开发安全的,数据库驱动的web应用:web2p采用Python语言编写,并且可以使用Python编程.web2py是一个完整的堆栈框架,也就是 ...

  9. 如何在SpringBoot的 过滤器之中注入Bean对象

    我建立一个全局拦截器,此拦截器主要用于拦截APP用户登录和请求API时候,必须加密,我把它命名为SecurityFilter,它继承了Filter,web应用启动的顺序是:listener->f ...

  10. webpack Uncaught ReferenceError: Swiper is not defined

    一.报错原因:Swiper的JS文件没有加载成功,或者说swiper丢失了依赖(正常操作是:加载后再初始化Swiper) 二.解决方法:在初始化 Swiper 的js文件中导入 Swiper impo ...