本蒟蒻刚学 OI 第二天,本地 AC 洛谷 RE!

P3806 【模板】点分治 1

chlchl @ 2022-01-21 08:22:31

昨天发暴力代码 RE 的帖解决了,今天又 RE 了……

真和 RE 过不去了 ORZ。

今天更奇怪,本地运行第一组数据是 AC 的,洛谷 RE。

#include<bits/stdc++.h>
using namespace std;

const int N = 1e4 + 10;
const int M = 1e7 + 10;
int n, m, rt, SZ, q[N], ans[M];
int sz[N], mson[N];
int len, dis[N], emp[M], dis_son[M], is_ok[M];
bool visit[N];
struct edge{int u, v, w;};
vector<edge> g[N];

void dfs(int u, int fa){
    sz[u] = 1, mson[u] = 0;
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i].v;
        if(v != fa && !visit[v]){
            dfs(v, u);
            mson[u] = max(mson[u], sz[v]);
            sz[u] += sz[v];
        }
    }
    mson[u] = max(mson[u], SZ - sz[u]);
    if(mson[u] < mson[rt])  rt = u; 
}

int query(int u, int fa){
    dis_son[++len] = dis[u];
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i].v, w = g[u][i].w;
        if(visit[v] || v == fa) continue;
        dis[v] = dis[u] + w;
        query(v, u);
    }
}

void solve(int u){
    int pos = 0;
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i].v, w = g[u][i].w;
        if(visit[v])    continue;
        len = 0, dis[v] = w;
        query(v, u);
        for(int j=len;j;j--){//遍历子树距离 
            for(int l=1;l<=m;l++){
                if(q[l] >= dis_son[j])  ans[l] |= is_ok[q[l] - dis_son[j]];
            }
        }
        for(int j=len;j;j--)    emp[++pos] = dis_son[j], is_ok[dis_son[j]] = 1;
    }
    for(int i=1;i<=pos;i++) is_ok[emp[i]] = 0;
}

void divide(int u){
    visit[u] = is_ok[0] = 1;
    solve(u);
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i].v, w = g[u][i].w;
        if(visit[v])    continue;
        solve(v);
        SZ = sz[u], rt = 0, mson[rt] = 1e9;
        dfs(v, 0);
//      cout << rt << endl;
        divide(rt);
    }
}

int main(){
//  freopen("1.txt", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i=1;i<n;i++){
        int u, v, w;
        scanf("%d%d%d", &u, &v, &w);
        g[u].push_back((edge){u, v, w});
        g[v].push_back((edge){v, u, w});
    }
    for(int i=1;i<=m;i++)   scanf("%d", &q[i]);
    SZ = n, mson[rt] = 1e9;
    dfs(1, 0);
    divide(rt);
    for(int i=1;i<=m;i++){
        if(ans[i])  puts("AYE");
        else    puts("NAY");
    }
    return 0; 
}

by Chang_Pei @ 2022-01-21 08:45:17

试试这个


by Chang_Pei @ 2022-01-21 08:45:47

@caihaolang


by 小鸭子天山 @ 2022-01-21 08:46:07

……qwq?


by chlchl @ 2022-01-21 08:49:36

@chenzhangpei 问题是我全 RE 啊……不止 #7。下载了 #1 测完之后是可以正常输出正确结果的。(验证码 njj8 祭)


by chlchl @ 2022-01-21 08:50:41

@小鸭子天山 我觉得我们可能认识……


by 小鸭子天山 @ 2022-01-21 08:51:32

@caihaolang 你谁呀?


by _k_e_v_i_n_ @ 2022-01-21 08:52:21

@caihaolang return呢?


by chlchl @ 2022-01-21 08:52:24

@小鸭子天山 我看到我有同学关注了你……我昵称就是我名字


by _k_e_v_i_n_ @ 2022-01-21 08:53:01

@caihaolang

int query(int u, int fa){
    dis_son[++len] = dis[u];
    for(int i=0;i<g[u].size();i++){
        int v = g[u][i].v, w = g[u][i].w;
        if(visit[v] || v == fa) continue;
        dis[v] = dis[u] + w;
        query(v, u);
    }
    //return呢?
}

by 小鸭子天山 @ 2022-01-21 08:53:09

不认识呀?


| 下一页