[JLOI2014]松鼠的新家
来源:互联网 发布:微信h5房卡牛牛源码 编辑:程序博客网 时间:2024/04/19 17:42
3631: [JLOI2014]松鼠的新家
Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1736 Solved: 840
Description
Input
Output
Sample Input
1 4 5 3 2
1 2
2 4
2 3
4 5
Sample Output
2
1
2
1
HINT
2<= n <=300000
思路:题意大致为在一棵树上进行一段段的点权值增加,有好多种方法可以解决,这里采用了树剖,同时用树状数组进行维护,直接进行最简单的区间修改,单点求值。
代码如下:
#include<cstdio>
#define N 300005
struct Node{
int v,next;
}e[N*2];
int bl[N],pos[N],size[N],deep[N],fa[N],road[N],head[N],n,id,sz,c[N];
int read()
{
int x=0,f=1;char ch=getchar();
for (;ch<'0'||ch>'9';ch=getchar()) if (ch=='-') f=-1;
for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
return x*f;
}
void add(int u,int v) {e[id].v=v;e[id].next=head[u];head[u]=id++;}
void dfs1(int u)
{
size[u]=1;
for (int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if (v==fa[u]) continue;
deep[v]=deep[u]+1;fa[v]=u;
dfs1(v);
size[u]+=size[v];
}
}
void dfs2(int u,int chain)
{
int k=0;pos[u]=++sz;bl[u]=chain;
for (int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if (deep[v]>deep[u]&&size[v]>size[k]) k=v;
}
if (k==0) return;
dfs2(k,chain);
for (int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if (deep[v]>deep[u]&&k!=v) dfs2(v,v);
}
}
void swap(int &A,int &B) {int T=A;A=B;B=T;}
void Add(int x,int w) {for (;x<=n;x+=x&-x) c[x]+=w;}
int qry(int x) {int sm=0;for (;x;x-=x&-x) sm+=c[x];return sm;}
void insert(int x,int y)
{
for (;bl[x]!=bl[y];)
{
if (deep[bl[x]]<deep[bl[y]]) swap(x,y);
Add(pos[x]+1,-1);
Add(pos[bl[x]],1);
x=fa[bl[x]];
}
if (pos[x]>pos[y]) swap(x,y);
Add(pos[y]+1,-1);
Add(pos[x],1);
}
int main()
{
n=read();id=1;sz=0;
for (int i=1;i<=n;i++) road[i]=read();
for (int i=1,u,v;i<n;i++) {u=read();v=read();add(u,v);add(v,u);}
dfs1(1);dfs2(1,1);
for (int i=1;i<n;i++)
insert(road[i],road[i+1]);
for (int i=1;i<=n;i++)
if (i==road[1]) printf("%d\n",qry(pos[i]));else printf("%d\n",qry(pos[i])-1);
return 0;
}
- [JLOI2014]松鼠的新家
- [JLOI2014]松鼠的新家
- [JLOI2014]松鼠的新家
- [JLOI2014]松鼠的新家
- [JLOI2014]松鼠的新家
- 【BZOJ3631】[JLOI2014]松鼠的新家 树链剖分
- bzoj 3631: [JLOI2014]松鼠的新家
- 【BZOJ 3631】 [JLOI2014]松鼠的新家
- 3631: [JLOI2014]松鼠的新家
- [BZOJ3631] [JLOI2014] 松鼠的新家
- 3631: [JLOI2014]松鼠的新家|树链剖分
- 3631:[JLOI2014]松鼠的新家
- bzoj 3631: [JLOI2014]松鼠的新家
- Bzoj3631【JLOI2014】松鼠的新家
- 【BZOJ3631】[JLOI2014]松鼠的新家
- BZOJ JLOI2014 松鼠的新家
- bzoj 3631 [JLOI2014]松鼠的新家
- bzoj3631: [JLOI2014]松鼠的新家
- ActiveForm表单提交
- STM32模块之NRF24L01
- java 指数计算
- 1351. Multi-key Sorting
- oracle sequence 跳号
- [JLOI2014]松鼠的新家
- 【Android学习之路】——为下级 Activity 添加向上按钮
- Android 之 IPC 进程通信全解析
- freemarker模板加载器
- 请将文件MP_verify_N8no8dpNO9n7wuBZ.txt上传至XXX指向的web服务器(或虚拟主机)的目录
- 用户输入一串整数和任意数目的空格,程序自动对所有的整数进行求和
- 【iOS】一键换肤效果实现
- 机器学习中基本知识及资源
- centos 7 查看网卡的mac地址(网卡无法启动的情况下)