[luogu3258][JLOI2014]松鼠的新家
题解
我们就在\([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]松鼠的新家的更多相关文章
- BZOJ 3631: [JLOI2014]松鼠的新家( 树链剖分 )
裸树链剖分... ------------------------------------------------------------------- #include<bits/stdc++ ...
- 3631: [JLOI2014]松鼠的新家
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 707 Solved: 342[Submit][Statu ...
- [填坑]树上差分 例题:[JLOI2014]松鼠的新家(LCA)
今天算是把LCA这个坑填上了一点点,又复习(其实是预习)了一下树上差分.其实普通的差分我还是会的,树上的嘛,也是懂原理的就是没怎么打过. 我们先来把树上差分能做到的看一下: 1.找所有路径公共覆盖的边 ...
- P3258 [JLOI2014]松鼠的新家
P3258 [JLOI2014]松鼠的新家倍增lca+树上差分,从叶子节点向根节点求前缀和,dfs求子树和即可,最后,把每次的起点和终点都. #include<iostream> #inc ...
- 洛谷 P3258 [JLOI2014]松鼠的新家 解题报告
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
- 【洛谷】【lca+树上差分】P3258 [JLOI2014]松鼠的新家
[题目描述:] 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n(2 ≤ n ≤ 300000)个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真 ...
- [Luogu 3258] JLOI2014 松鼠的新家
[Luogu 3258] JLOI2014 松鼠的新家 LCA + 树上差分. 我呢,因为是树剖求的 LCA,预处理了 DFN(DFS 序),于是简化成了序列差分. qwq不讲了不讲了,贴代码. #i ...
- [JLOI2014] 松鼠的新家 (lca/树上差分)
[JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他居然真的住在 ...
- 洛谷P3258 [JLOI2014]松鼠的新家
P3258 [JLOI2014]松鼠的新家 题目描述 松鼠的新家是一棵树,前几天刚刚装修了新家,新家有n个房间,并且有n-1根树枝连接,每个房间都可以相互到达,且俩个房间之间的路线都是唯一的.天哪,他 ...
随机推荐
- Part 6:静态文件--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 前面我们编写了一个经过测试的投票应用,现在让 ...
- 【nodejs】让nodejs像后端mvc框架(asp.net mvc )一样处理请求--控制器的声明定义和发现篇(3/8)
文章目录 前情概要 前面文章把路由已经介绍的差不多了,包括url映射,路由选择等.接下来讲一讲controller的一些基本规则 BaseController的所有代码都在这里拉.相当简单. 主要逻辑 ...
- C/C++中连接函数strcat的应用(简单讲解)
有位学弟问到我如何将两个字符连接起来,想想java/python里面可以直接用+连接起来,可是C/C++里面有没有这么方便的做法呢? 答案是有的,在C语言的string.h库中有个神奇的函数叫做str ...
- Docker 创建容器以及管理命令(三)
1. 创建 Apache 容器 [root@centos7 ~]# docker run -d -p : httpd // -d: 放入后台运行 // -p: 指定端口映射关系(第一个为本地端口.第二 ...
- ruby安装及升级
在centos6.x下执行上面的"gem install redis"操作可能会报错,坑很多!默认yum安装的ruby版本是1.8.7,版本太低,需要升级到ruby2.2以上,否则 ...
- Python自动化运维工具-Fabric部署及使用总结
使用shell命令进行复杂的运维时,代码往往变得复杂难懂,而使用python脚本语言来编写运维程序,就相当于开发普通的应用一样,所以维护和扩展都比较简单,更重要的是python运维工具fabric能自 ...
- Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)-C. Plasticine zebra
问了学长,感觉还是很迷啊,不过懂了个大概,这个翻转操作,实质不就是在序列后面加上前面部分比如 bw | wwbwwbw 操作过后 wbwbwwbww 而 bw | wwbwwbwbw 这样我们就知道 ...
- D. Too Easy Problems
链接 [http://codeforces.com/group/1EzrFFyOc0/contest/913/problem/D] 题意 给你n个题目,考试时间T,对于每个问题都有一个ai,以及解决所 ...
- 《移山之道》Reading Task——by12061154Joy
最近因为作业的原因所以接触到了这本书,给我最特别的感觉就是很新鲜,主要是因为这本书是以故事展开的,大概是我读的书太少,基本没有看到过专业书的知识体系是用故事串讲起来的,这样帮助读者理解了一些概念并且不 ...
- Linux内核读书笔记第六周
主要内容: 什么是调度 调度实现原理 Linux上调度实现的方法 调度相关的系统调用 什么是调度 现在的操作系统都是多任务的,为了能让更多的任务能同时在系统上更好的运行,需要一个管理程序来管理计算机上 ...