标签:name image 没事 考试 pre 技术 details sum from
震惊,我居然不会数细胞。
菜的离谱。
T1: 100 \(\rightarrow\) 80
T4: 20 \(\rightarrow\) 0
震惊,我建边居然不开二倍,那没事了。
树上差分裸题。
#include <bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
int n;
int a[maxn];
struct Edge{
int from,to,nxt;
}e[maxn];//这样直接80 = =
inline int read(){
int x=0;bool fopt=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch==‘-‘)fopt=0;
for(;isdigit(ch);ch=getchar())x=(x<<3)+(x<<1)+ch-48;
return fopt?x:-x;
}
int head[maxn],cnt;
inline int add(int u,int v){
e[++cnt].from=u;
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt;
}
int fa[maxn],dep[maxn],siz[maxn],son[maxn];
void dfs1(int u){
dep[u]=dep[fa[u]]+1;siz[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u])continue;
fa[v]=u;dfs1(v);
siz[u]+=siz[v];
if(!son[u]||siz[v]>siz[son[u]])son[u]=v;
}
}
int top[maxn];
void dfs2(int u,int t){
top[u]=t;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u])continue;
dfs2(v,v==son[u]?t:v);
}
}
inline int lca(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]<dep[top[v]])swap(u,v);
u=fa[top[u]];
}
return dep[u]<dep[v]?u:v;
}
int c[maxn];
long long f[maxn];
void dfs3(int u){
f[u]=c[u];
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v==fa[u])continue;
dfs3(v);
f[u]+=f[v];
}
}
int main(){
#ifndef LOCAL
freopen("home.in","r",stdin);
freopen("home.out","w",stdout);
#endif
n=read();
for(int i=1;i<=n;i++)
a[i]=read();
for(int i=1;i<n;i++){
int u=read(),v=read();
add(u,v);add(v,u);
}
dfs1(1);dfs2(1,1);
for(int i=1;i<n;i++){
int u=a[i],v=a[i+1],lcam=lca(u,v);
c[u]++;c[v]++;c[lcam]--;
if(fa[lcam])c[fa[lcam]]--;
}
dfs3(1);
for(int i=2;i<=n;i++)
f[a[i]]--;
for(int i=1;i<=n;i++)
printf("%lld\n",f[i]);
return 0;
}
谢谢,已经在学了
震惊,贪心题我居然 DP,直接挂掉。
震惊,这题居然是莫队。
震惊,我居然不会数细胞。已经开始学队列和栈了。
【考试反思】联赛模拟测试12 (To be continued)
标签:name image 没事 考试 pre 技术 details sum from
原文地址:https://www.cnblogs.com/Midoria7/p/13784857.html