天天爱跑步

思路:

  树上差分+分层动态线段树;

  (伏地膜,跪烂xxy)

代码:

#include <bits/stdc++.h>
using namespace std;
#define maxn 300005
#define maxtot maxn*19
int n,m,deep[maxn],top[maxn],size[maxn];
int f[maxn],cnt,head[maxn],E[maxn<<],V[maxn<<];
int watch[maxn],st[maxn],en[maxn],tot,Count,ans[maxn];
int lc[maxtot],rc[maxtot],dis[maxtot],lar[maxn];
int lca[maxn],id[maxn],root[maxn*],li[maxn],ri[maxn];
inline void in(int &now)
{
int if_z=;now=;
char Cget=getchar();
while(Cget>''||Cget<'')
{
if(Cget=='-') if_z=-;
Cget=getchar();
}
while(Cget>=''&&Cget<='')
{
now=now*+Cget-'';
Cget=getchar();
}
now*=if_z;
}
void dfs1(int now,int fa)
{
size[now]=,f[now]=fa;
deep[now]=deep[fa]+;
for(int i=head[now];i;i=E[i])
{
if(V[i]==f[now]) continue;
dfs1(V[i],now),size[now]+=size[V[i]];
if(size[V[i]]>size[lar[now]]) lar[now]=V[i];
}
}
void dfs2(int now,int chain)
{
top[now]=chain,id[now]=++cnt,li[now]=cnt;
if(lar[now]) dfs2(lar[now],chain);
else
{
ri[now]=cnt;
return;
}
for(int i=head[now];i;i=E[i])
{
if(V[i]==f[now]||V[i]==lar[now]) continue;
dfs2(V[i],V[i]);
}
ri[now]=cnt;
}
inline int find(int x,int y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
x=f[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
return x;
}
void updata(int &now,int l,int r,int to,int x)
{
if(!to) return;
if(!now) now=++tot;
dis[now]+=x;
if(l==r) return;
int mid=l+r>>;
if(to<=mid) updata(lc[now],l,mid,to,x);
else updata(rc[now],mid+,r,to,x);
}
void query(int now,int l,int r,int tl,int tr)
{
if(!now) return;
if(l>=tl&&r<=tr)
{
Count+=dis[now];
return;
}
int mid=l+r>>;
if(tl<=mid) query(lc[now],l,mid,tl,tr);
if(tr>mid) query(rc[now],mid+,r,tl,tr);
}
int main()
{
in(n),in(m);int u,v,pos;
for(int i=;i<n;i++)
{
in(u),in(v);
E[++cnt]=head[u],V[cnt]=v,head[u]=cnt;
E[++cnt]=head[v],V[cnt]=u,head[v]=cnt;
}
cnt=,dfs1(,),cnt=,dfs2(,);
for(int i=;i<=n;i++) in(watch[i]);
for(int i=;i<=m;i++)
{
in(st[i]),in(en[i]);
lca[i]=find(st[i],en[i]);
updata(root[deep[st[i]]],,n,id[st[i]],);
updata(root[deep[st[i]]],,n,id[f[lca[i]]],-);
}
for(int i=;i<=n;i++)
{
Count=;
query(root[deep[i]+watch[i]],,n,li[i],ri[i]);
ans[i]=Count;
}
memset(rc,,sizeof(rc));
memset(lc,,sizeof(lc));
memset(dis,,sizeof(dis));
memset(root,,sizeof(root));
tot=;
for(int i=;i<=m;i++)
{
pos=deep[st[i]]-deep[lca[i]]*+n*;
updata(root[pos],,n,id[en[i]],);
updata(root[pos],,n,id[lca[i]],-);
}
for(int i=;i<=n;i++)
{
Count=;
query(root[watch[i]-deep[i]+n*],,n,li[i],ri[i]);
ans[i]+=Count;
}
for(int i=;i<=n;i++) printf("%d ",ans[i]);
return ;
}

AC日记——天天爱跑步 洛谷 P1600的更多相关文章

  1. AC日记——[SDOI2015]星际战争 洛谷 P3324

    题目描述 3333年,在银河系的某星球上,X军团和Y军团正在激烈地作战. 在战斗的某一阶段,Y军团一共派遣了N个巨型机器人进攻X军团的阵地,其中第i个巨型机器人的装甲值为Ai.当一个巨型机器人的装甲值 ...

  2. AC日记——联合权值 洛谷 P1351

    题目描述 无向连通图G 有n 个点,n - 1 条边.点从1 到n 依次编号,编号为 i 的点的权值为W i ,每条边的长度均为1 .图上两点( u , v ) 的距离定义为u 点到v 点的最短距离. ...

  3. AC日记——I Hate It 洛谷 P1531

    题目背景 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 题目描述 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的 ...

  4. AC日记——神奇的幻方 洛谷 P2615(大模拟)

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

  5. AC日记——[CQOI2009]DANCE跳舞 洛谷 P3153

    [CQOI2009]DANCE跳舞 思路: 二分+最大流: 代码: #include <cstdio> #include <cstring> #include <iost ...

  6. AC日记——松江1843路 洛谷七月月赛

    松江1843路 思路: 三分: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define ...

  7. AC日记——严酷的训练 洛谷 P2430

    严酷的训练 思路: 背包: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 5005 int n,m,bi[m ...

  8. AC日记——[SDOI2010]大陆争霸 洛谷 P3690

    [SDOI2010]大陆争霸 思路: dijkstra模板: 代码: #include <bits/stdc++.h> using namespace std; #define maxn ...

  9. AC日记——小魔女帕琪 洛谷 P3802

    小魔女帕琪 思路: 概率公式计算: 代码: #include <bits/stdc++.h> using namespace std; ],sig; int main() { ;i< ...

随机推荐

  1. Java的四种引用?用到的场景?

    在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说,只有对象处于可触及(reachable)状态,程序才能使用它.从JDK 1.2版本开始,把对象的引用分 ...

  2. Aidl实现进程间通信,跨进程回调

    aidl支持的文件类型 1. Java 编程语言中的基本类型, 如 int.long.boolean 等, 不需要 import. 2. String.List.Map 和 CharSequence, ...

  3. stout代码分析之十一:hashmap和multihashmap

    hashmap是std::unordered_map的子类,前者对后者的接口做了进一步封装. hashmap的移动构造函数: hashmap(std::map<Key, Value>&am ...

  4. git branch 重命名

    有时候你会有重命名一个git branch的冲动,不要怀疑,这是真的.command bellow will give u a big help,no thanks~ git branch - m o ...

  5. Elasticsearch6.0 IKAnalysis分词使用

    Elasticsearch 内置的分词器对中文不友好,会把中文分成单个字来进行全文检索,不能达到想要的结果,在全文检索及新词发展如此快的互联网时代,IK可以进行友好的分词及自定义分词. IK Anal ...

  6. JavaScript的性能优化:加载和执行

    随着 Web2.0 技术的不断推广,越来越多的应用使用 javascript 技术在客户端进行处理,从而使 JavaScript 在浏览器中的性能成为开发者所面临的最重要的可用性问题.而这个问题又因 ...

  7. 51Nod 1094 和为k的连续区间 | 水

    Input示例 6 10 1 2 3 4 5 6 Output示例 1 4 #include "cstdio" #include "algorithm" #in ...

  8. redis 模糊查找keys

    Redis入门教程可参考:超强.超详细Redis数据库入门教程 Redis操作命令可参考:Redis操作命令总结 redis可以通过命令Keys Match来进行键值的模糊匹配,借助StackExch ...

  9. OScached缓存整个页面和缓存局部页面

    1.缓存整个页面 在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存.主要用于对web应用中的某些动态页面进行缓存,尤其是那些需要生成PDF格式文件/报表.图片文件等的页面,不 ...

  10. 【Foreign】登山 [DP][数学]

    登山 Time Limit: 10 Sec  Memory Limit: 256 MB Description 恶梦是一个登山爱好者,今天他来到了黄山 俗话说的好,不走回头路.所以在黄山,你只能往前走 ...