首页 > 其他分享 >做题记录整理图论2 P1600 [NOIP2016 提高组] 天天爱跑步(2022/10/4)

做题记录整理图论2 P1600 [NOIP2016 提高组] 天天爱跑步(2022/10/4)

时间:2022-10-08 21:48:18浏览次数:82  
标签:NOIP2016 fa dep int 2022 lca P1600 -- for1

P1600 [NOIP2016 提高组] 天天爱跑步

题解
由于这位大佬似乎afo(?)了,所以我没搞懂那个桶怎么处理,到时候要回来再看一遍

#include <bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
int n, m, cnt, hd[300005], dep[300005], fa[300005][23], w[300005];
int cnt1, cnt2, hd1[300005], hd2[300005];
struct node {
    int to;
    int nex;
} a1[300005 * 2], a2[300005 * 2], a3[300005 * 2];

int b1[700005], b2[700005], ji[300005], dis[300005], s[300005], t[300005], l[300005], ans[300005];
const int inf = 300005;
void add(int x, int y) {
    a1[++cnt].to = y;
    a1[cnt].nex = hd[x];
    hd[x] = cnt;
}

void add1(int x, int y) {
    a2[++cnt1].to = y;
    a2[cnt1].nex = hd1[x];
    hd1[x] = cnt1;
}
void add2(int x, int y) {
    a3[++cnt2].to = y;
    a3[cnt2].nex = hd2[x];
    hd2[x] = cnt2;
}

void dfs1(int x, int fat) {
    fa[x][0] = fat;
    dep[x] = dep[fat] + 1;

    for (int i = 1; (1 << i) <= dep[x]; i++)
        fa[x][i] = fa[fa[x][i - 1]][i - 1];

    for (int i = hd[x]; i; i = a1[i].nex) {
        int y = a1[i].to;

        if (y == fat)
            continue;

        dfs1(y, x);
    }
}

int gl(int x, int y) {
    if (x == y)
        return x;

    if (dep[x] < dep[y])
        swap(x, y);

    for (int i = 21; i >= 0; i--)
        if (dep[fa[x][i]] >= dep[y])
            x = fa[x][i];

    if (x == y)
        return x;

    for (int i = 21; i >= 0; i--)
        if (fa[x][i] != fa[y][i])
            x = fa[x][i], y = fa[y][i];

    return fa[x][0];
}


void dfs2(int x) {
    int t1 = b1[w[x] + dep[x]], t2 = b2[w[x] - dep[x] + inf];

    for (int i = hd[x]; i; i = a1[i].nex) {
        int y = a1[i].to;

        if (y == fa[x][0])
            continue;

        dfs2(y);
    }

    b1[dep[x]] += ji[x];

    for (int i = hd1[x]; i; i = a2[i].nex) {
        int y = a2[i].to;
        b2[dis[y] - dep[t[y]] + inf]++;
    }

    ans[x] += b1[w[x] + dep[x]] - t1 + b2[w[x] - dep[x] + inf] - t2;

    for (int i = hd2[x]; i; i = a3[i].nex) {
        int y = a3[i].to;
        b1[dep[s[y]]]--;
        b2[dis[y] - dep[t[y]] + inf]--;
    }
}

int main() {
    scanf("%d%d", &n, &m);
    int x, y;
    for1(i, 1, n - 1) {
        scanf("%d%d", &x, &y);
        add(x, y);
        add(y, x);
    }
    dep[1] = 1;
    fa[1][0] = 1;
    dfs1(1, 0);
    for1(i, 1, n) scanf("%d", &w[i]);
    for1(i, 1, m) {
        scanf("%d%d", &s[i], &t[i]);
        int lca = gl(s[i], t[i]);
        dis[i] = dep[s[i]] + dep[t[i]] - 2 * dep[lca];
        ji[s[i]]++;
        add1(t[i], i);
        add2(lca, i);

        if (dep[lca] + w[lca] == dep[s[i]])
            ans[lca]--;
    }
    dfs2(1);
    for1(i, 1, n)
    printf("%d ", ans[i]);
    return 0;
}

标签:NOIP2016,fa,dep,int,2022,lca,P1600,--,for1
From: https://www.cnblogs.com/yyx525jia/p/16770287.html

相关文章

  • 20221008
    20221008(大寄)题目t1\(n\)维偏序递推​ 乍一看这题就像个\(O(n)\)的递推,甚至根本算不上递推。如果可以到达第\(i-1\)座房屋,或者第\(i-2\)座房屋,并且可以从他们其中......
  • 2022-2023-1 20221425 《计算机基础与程序设计》第6周学习总结
    学期(如2022-2023-1)学号(如:20221300)《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这......
  • 2022NOIP联测5
    T1挑战题意:有两行字符串,有\(*\)和\(.\)两种字符,你可以进行一种操作,将一个格子的\(*\)推到相邻的格子,如果推到一个有\(*\)的格子,那么将\(*\)合并,求最后把所有......
  • 2022-2023-1 20221419 《计算机基础与程序设计》第6周学习总结
    2022-2023-120221419《计算机基础与程序设计》第6周学习总结作业信息班级:[2022-2023-1-计算机基础与程序设计]https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP......
  • 20221008测试总结
    n维偏序题目背景1363擅长跑酷(迫真!题目描述今天\(1363\)要挑战在\(n\)座排成一排的房屋上跑酷。第\(i\)座房子的高度是\(h_i\)。初始时\(1363\)站在第一座房......
  • 【2022-10-08】 DRF从入门到入土(六)
    drf之路由组件自动生成路由#drf提供了两个路由类,只要继承了ViewSetMixin及其子类的视图类,就可以使用这两个路由类来自动生成路由#使用步骤如下:1导入模块:fromr......
  • Dytechlab Cup 2022 (A - C)
    DytechlabCup2022(A-C)A-ElaSortingBooks分析:贪心,将字符串每一位都存在map里,从前往后尽量让每一个\(n/k\)的段\(mex\)值尽量大,模拟mex即可。voidsolve(){ ......
  • 【闲话】2022.10.08
    今日考试又寄了怎么凡是Accoders上的考试我都会寄啊今天Winter'SRain先生搞魔改猪国杀然后\(\color{red}{\查\抄\正\着\}\)实在是……太巨了今天挂一张......
  • 2022洛阳师范学院ACM实验室招新竞赛题解
    A萌新签到题目描述欢迎大家来参加2022洛阳师范学院ACM实验室新生赛,我们实验室全体学长学姐从暑假一直期盼着你们的到来。我们的小萌新那么可爱,学长学姐肯定不会为难大......
  • 2022-2023-1 20221423 《计算机基础与程序设计》第六周学习总结
    学期2022-2023-1学号20221423《计算机基础与程序设计》第六周学习总结作业信息这个作业属于哪个课程2022-2023-1-计算机基础与程序设计)这个作业要求在哪里20......