题解

我们就在\([a_i,a_{i+1}]\)的路径上都\(+1\),然后单点查询就可以了。

ac代码(吸了氧才过的QwQ)

# include <bits/stdc++.h>
# define LL long long
# define ms(a,b) memset(a,b,sizeof(a))
# define ri (register int)
# define inf (0x7f7f7f7f)
# define pb push_back
# define fi first
# define se second
# define pii pair<int,int>
# define File(s) freopen(s".in","r",stdin),freopen(s".out","w",stdout)
using namespace std;
inline int gi(){
    int w=0,x=0;char ch=0;
    while(!isdigit(ch)) w|=ch=='-',ch=getchar();
    while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return w?-x:x;
}
# define N 1300005
struct segment_tree{
    # define mid ((l+r)>>1)
    # define ls (nod<<1)
    # define rs (nod<<1|1)
    struct node{
        int l,r,s,tag;
    }tr[N<<2];
    void pushup(int nod){
        tr[nod].s=tr[ls].s+tr[rs].s;
    }
    void pushdown(int nod){
        register int tmp=tr[nod].tag,l=tr[nod].l,r=tr[nod].r; tr[nod].tag=0;
        if (tmp==0) return;
        tr[ls].tag+=tmp; tr[rs].tag+=tmp;
        tr[ls].s+=tmp*(mid-l+1); tr[rs].s+=tmp*(r-mid);
    }
    void build(int l,int r,int nod){
        tr[nod].l=l,tr[nod].r=r,tr[nod].tag=0,tr[nod].s=0;
        if (l==r) return;
        build(l,mid,ls); build(mid+1,r,rs);
        pushup(nod);
    }
    void update_sec(int nod,int ql,int qr,int v){
        register int l=tr[nod].l,r=tr[nod].r; pushdown(nod);
        if (ql<=l&&r<=qr){
            tr[nod].tag+=v;
            tr[nod].s+=(r-l+1)*v;
            return;
        }
        if (ql<=mid) update_sec(ls,ql,qr,v);
        if (qr>mid) update_sec(rs,ql,qr,v);
        pushup(nod);
    }
    int query_point(int nod,int k){
        register int l=tr[nod].l,r=tr[nod].r;
        pushdown(nod);
        if (l>=r) return tr[nod].s;
        if (k<=mid) return query_point(ls,k);
        else return query_point(rs,k);
    }
}tr;
struct edge{
    int to,nt;
}E[N<<1];
int son[N],top[N],sz[N],fa[N],H[N],dep[N],idx[N],a[N];
int cnt,tot,n,m;
inline void addedge(int u,int v){
    E[++cnt]=(edge){v,H[u]}; H[u]=cnt;
}
inline void dfs1(int u,int ft,int dp){
    dep[u]=dp; fa[u]=ft; sz[u]=1;
    register int maxson=-1;
    for (register int e=H[u];e;e=E[e].nt){
        int v=E[e].to; if (v==fa[u]) continue;
        dfs1(v,u,dp+1); sz[u]+=sz[v];
        if (sz[v]>maxson) maxson=sz[v],son[u]=v;
    }
}
inline void dfs2(int u,int tp){
    top[u]=tp; idx[u]=++tot;
    if (!son[u]) return;
    dfs2(son[u],tp);
    for (register int e=H[u];e;e=E[e].nt){
        int v=E[e].to; if (v==fa[u]||v==son[u]) continue;
        dfs2(v,v);
    }
}
void update(int u,int v,int w){
    while (top[u]!=top[v]){
        if (dep[top[u]]<dep[top[v]]) swap(u,v);
        tr.update_sec(1,idx[top[u]],idx[u],w);
        u=fa[top[u]];
    }
    if (dep[u]>dep[v]) swap(u,v);
    tr.update_sec(1,idx[u],idx[v],w);
}
int main(){
    n=gi();
    for (int i=1;i<=n;++i) a[i]=gi();
    for (int i=1;i<n;++i){
        int u=gi(),v=gi();
        addedge(u,v); addedge(v,u);
    }
    dfs1(1,0,1); dfs2(1,1); tr.build(1,n,1);
    for (int i=1;i<n;++i){
        update(a[i],a[i+1],1);
        update(a[i+1],a[i+1],-1);
    }
    for (int i=1;i<=n;++i) printf("%d\n",tr.query_point(1,idx[i]));
    return 0;
}

[luogu3258][JLOI2014]松鼠的新家的更多相关文章

  1. BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )

    裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...

  2. 3631: [JLOI2014]松鼠的新家

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 707  Solved: 342[Submit][Statu ...

  3. [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)

    今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分.其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过. 我们先来把树上差分能做到的看一下: 1.找所有路径公共覆盖的边 ...

  4. P3258 [JLOI2014]松鼠的新家

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

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

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

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

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

  7. [Luogu 3258] JLOI2014 松鼠的新家

    [Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...

  8. [JLOI2014] 松鼠的新家 (lca/树上差分)

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

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

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

随机推荐

  1. aurora 64B/66B ip核设置与例程代码详解

    见网页https://blog.csdn.net/u014586651/article/details/84349328 https://blog.csdn.net/u012135070/articl ...

  2. python实现微信自动回复机器人

    一 简单介绍 wxpy基于itchat,使用了 Web 微信的通讯协议,,通过大量接口优化提升了模块的易用性,并进行丰富的功能扩展.实现了微信登录.收发消息.搜索好友.数据统计等功能. 总而言之,可用 ...

  3. python之魔法方法介绍

    1.1. 简介 什么是魔法方法呢?它们在面向对象的Python的处处皆是.它们是一些可以让你对类添加“魔法”的特殊方法. 它们经常是两个下划线包围来命名的(比如 __init__ , __lt__ ) ...

  4. Linux文件下载(转)

    wget是Linux最常用的下载命令, 一般的使用方法是: wget + 空格 + 要下载文件的url路径 例如: # wget http://www.linuxsense.org/xxxx/xxx. ...

  5. Ionic 1 & 2 开发常见问题 Q&A

    原文发表于我的技术博客 本文分享了在 Ionic 1 & 2 版本开发过程中常见问题的一些 Q&A,供慕课网同学或其他朋友参考. 原文发表于我的技术博客 1. 版本的问题 Ionic ...

  6. 利用阿里云的源yum方式安装Mongodb

    今天在线上服务器上安装MongoDB,从Mongo官网直接下载链接,结果在下载时发觉速度慢的可怜.迫于无奈,只能找国内的镜像下载.这里选择阿里云的源进行安装,记录如下: 1)在/etc/yum.rep ...

  7. ansible环境部署及常用模块总结 - 运维笔记

    一.  Ansible 介绍Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于py ...

  8. Centos7.2下OpenVPN 环境完整部署记录

    关于OpenVPN的有关介绍及为何使用OpenVPN在此就不做赘述了,下面直接记录Centos7.2系统下部署OpenVPN环境的操作过程: 1) 先将本机的yum换成阿里云的yum源 [root@t ...

  9. <<浪潮之巅>>阅读笔记一

    第一次的阅读就想读这本书的,却因为很多愿意一直拖到现在,因为听说这本书在李开复先生 的微博上有推荐,更是增加了我的阅读兴趣.可能是因为在网上找的电子版的原因,通篇阅读的速度很快,但是没有纸质数那种细嚼 ...

  10. 构建之法--初识Git

    该作业来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2103 GitHub地址:https://github.com/GVic ...