码迷,mamicode.com
首页 > 其他好文 > 详细

【考试反思】联赛模拟测试12 (To be continued)

时间:2020-10-09 21:10:31      阅读:20      评论:0      收藏:0      [点我收藏+]

标签:name   image   没事   考试   pre   技术   details   sum   from   

震惊,我居然不会数细胞。

菜的离谱。

技术图片

T1: 100 \(\rightarrow\) 80

T4: 20 \(\rightarrow\) 0

T1:松鼠的新家

震惊,我建边居然不开二倍,那没事了。

树上差分裸题。

Code
#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;
}

技术图片

谢谢,已经在学了

T2:trade

震惊,贪心题我居然 DP,直接挂掉。

T3:sum

震惊,这题居然是莫队。

T4:building

震惊,我居然不会数细胞。已经开始学队列和栈了。

【考试反思】联赛模拟测试12 (To be continued)

标签:name   image   没事   考试   pre   技术   details   sum   from   

原文地址:https://www.cnblogs.com/Midoria7/p/13784857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!