这题……暴力分也好足啊。

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

曹老师 @ 2018-10-19 20:18:45

为什么要说也呢?

话说NOIP史上最难的题暴力分给的这么足……


by 曹老师 @ 2018-10-19 20:19:44

80分210+行代码占沙发

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
using namespace std;

struct Node {
    int to , next;
};
Node e[200005];
int n , m;
vector<int>map[100005];
int val2[100005] , opt2[100005];
int head[100005] , tot , deep[100005] , val4[100005] , num[200005];

void sol1() {
    int val[1005] , opt[1005];
    for(int i=1; i<n; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
    }
    memset(opt , 0 , sizeof(opt));
    for(int i=1; i<=n; i++)
        scanf("%d",&val[i]);
    for(int i=1; i<=m; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
        if(!val[x])
            opt[x]++;
    }
    for(int i=1; i<=n; i++)
        printf("%d ",opt[i]);
}

void sol2() {
    int ans = 0 , opt[1005];
    memset(opt , 0 , sizeof(opt));
    for(int i=1; i<n; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
    }
    for(int i=1; i<=n; i++) {
        int x;
        scanf("%d",&x);
    }
    for(int i=1; i<=m; i++) {
        int s , t;
        scanf("%d%d",&s,&t);
        opt[s]++;
    }
    for(int i=1; i<=n; i++)
        printf("%d ",opt[i]);
}

void sol3() {
    for(int i=1; i<n; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
    }
    for(int i=1; i<=n; i++)
        scanf("%d",&val2[i]);
    for(int i=1; i<=n; i++) {
        int s , t;
        scanf("%d%d",&s,&t);
        map[s].push_back(t);
    }
    for(int i=1; i<=n; i++) {
        int ans = 0 , l = i - val2[i] , r = i + val2[i] , sz1 , sz2;
        if(l>0) {
            sz1 = map[l].size();
            for(int j=0; j<sz1; j++)
                if(map[l][j]>=i)
                    ans++;
        }
        if(r<=n) {
            sz2 = map[r].size();
            for(int j=0; j<sz2; j++)
                if(map[r][j]<=i)
                    ans++;
        }
        opt2[i] = ans;
    }
    for(int i=1; i<=n; i++)
        printf("%d ",opt2[i]);
}

void add(int x , int y) {
    tot++;
    e[tot].next = head[x];
    e[tot].to = y;
    head[x] = tot;
}

void dfs(int u , int f) {
    for(int i=head[u]; i; i=e[i].next) {
        int v = e[i].to;
        if(v==f)
            continue;
        deep[v] = deep[u] + 1;
        dfs(v , u);
        num[u] += num[v];
    }
}

void sol4() {
    for(int i=1; i<n; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
        add(x , y);
        add(y , x);
    }
    for(int i=1; i<=n; i++)
        scanf("%d",&val4[i]);
    for(int i=1; i<=m; i++) {
        int s , t;
        scanf("%d%d",&s,&t);
        num[t]++;
    }
    deep[1] = 0;
    dfs(1 , 0);
    for(int i=1; i<=n; i++) {
        if(deep[i]==val4[i])
            printf("%d ",num[i]);
        else
            printf("0 ");   
    }   
}

int dfs1(int u , int f , int aim , int dfn) {
    if(u==aim) {
        if(dfn==val2[u])
            opt2[u]++;
        return 1;
    }
    for(int i=head[u]; i; i=e[i].next) {
        int v = e[i].to;
        if(v==f)
            continue;
        if(dfs1(v , u , aim , dfn+1)) {
            if(dfn==val2[u]) {
                opt2[u]++;
            }
            return 1;
        }
    }
}

void sol5() {
    for(int i=1; i<n; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
        add(x , y);
        add(y , x);
    }
    for(int i=1; i<=n; i++)
        scanf("%d",&val2[i]);
    for(int i=1; i<=m; i++) {
        int s , t;
        scanf("%d%d",&s,&t);
        dfs1(s , 0 , t , 0);
    }
    for(int i=1; i<=n; i++)
        printf("%d ",opt2[i]);
}

void dfs2(int u , int f , int dep) {
    int temp = num[dep+val2[u]];
    if(val4[u])
        num[dep] += val4[u];
    for(int i=head[u]; i; i=e[i].next) {
        int v = e[i].to;
        if(v == f)
            continue;
        dfs2(v , u , dep+1);
    }
    opt2[u] = num[dep+val2[u]] - temp;
}

void sol6() {
    for(int i=1; i<n; i++) {
        int x , y;
        scanf("%d%d",&x,&y);
        add(x , y);
        add(y , x);
    }
    for(int i=1; i<=n; i++)
        scanf("%d",&val2[i]);
    for(int i=1; i<=m; i++) {
        int s , t;
        scanf("%d%d",&s,&t);
        val4[s]++;
    }
    dfs2(1 , 0 , 0);
    for(int i=1; i<=n; i++)
        printf("%d ",opt2[i]);
}

int main() {
    scanf("%d%d",&n,&m);
    if(n%10==1)
        sol1();
    if(n%10==2)
        sol2();
    if(n%10==4)
        sol3();
    if(n%10==5)
        sol4();
    if(n%10==3)
        sol5();
    if(n%10==6)
        sol6();
    return 0;
}

by wwz20050323 @ 2018-10-19 20:20:16

tql


by 皎月半洒花 @ 2018-10-19 20:20:44

好腻害的样子qaq


by hfee @ 2018-10-19 20:21:10

dldl


by 曹老师 @ 2018-10-19 20:21:57

@皎月半洒花 花姐永远最强


by 皎月半洒花 @ 2018-10-19 21:18:14

@曹老师 别乱奶啊qaq


by 逍遥_向尾喵 @ 2018-10-19 21:33:45

好厉害,——_——|||


by qsmoonzh @ 2018-11-04 22:47:19

@曹老师 码量好大啊


by qsmoonzh @ 2018-11-04 22:48:08

WA,居然还有这种东西

提示: 数据范围的个位上的数字可以帮助判断是哪一种数据类型。


by Thaumaturge @ 2019-07-05 20:38:19

(针对数据)就算啥也不会也能骗到80分,太给力了qwq

面向数据编程


|