提交记录 7302


用户 题目 状态 得分 用时 内存 语言 代码长度
ouuan noip18f. 【NOIP2018】保卫王国 Accepted 100 171.924 ms 93692 KB C++ 4.97 KB
提交时间 评测时间
2019-01-25 08:09:18 2020-08-01 01:02:37
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N=100010;
const long long INF=1e10;

void dfs1(int u);
void dfs2(int u);
void add(int u,int v);

int head[N],nxt[N<<1],to[N<<1],cnt;
long long n,m,p[N],f[N][2],g[N][2],bz[N][20][2][2],fa[N][20],dep[N],ans[2][2],anss[2][2][2],ansss;
char type[20];

int main()
{
    int i,u,v,a,b,x,y,cur=0;
    
    scanf("%lld%lld%s",&n,&m,type);
    
    for (i=1;i<=n;++i)
    {
        scanf("%lld",p+i);
    }
    
    for (i=1;i<n;++i)
    {
        scanf("%d%d",&u,&v);
        add(u,v);
        add(v,u);
    }
    
    fa[1][0]=1;
    
    dfs1(1);
    dfs2(1);
    
    for (i=1;i<=16;++i)
    {
        for (u=1;u<=n;++u)
        {
            fa[u][i]=fa[fa[u][i-1]][i-1];
            bz[u][i][0][1]=min(bz[u][i-1][0][0]+bz[fa[u][i-1]][i-1][0][1],bz[u][i-1][0][1]+bz[fa[u][i-1]][i-1][1][1]);
            bz[u][i][1][0]=min(bz[u][i-1][1][0]+bz[fa[u][i-1]][i-1][0][0],bz[u][i-1][1][1]+bz[fa[u][i-1]][i-1][1][0]);
            bz[u][i][1][1]=min(bz[u][i-1][1][0]+bz[fa[u][i-1]][i-1][0][1],bz[u][i-1][1][1]+bz[fa[u][i-1]][i-1][1][1]);
            bz[u][i][0][0]=min(bz[u][i-1][0][0]+bz[fa[u][i-1]][i-1][0][0],bz[u][i-1][0][1]+bz[fa[u][i-1]][i-1][1][0]);
        }
    }
    
    while (m--)
    {
        scanf("%d%d%d%d",&a,&x,&b,&y);
        u=a;
        v=b;
        if (dep[u]<dep[v])
        {
            swap(u,v);
            swap(a,b);
            swap(x,y);
        }
        ans[cur][x]=f[u][x];
        ans[cur][x^1]=INF;
        for (i=16;i>=0;--i)
        {
            if ((dep[u]-dep[v])&(1<<i))
            {
                cur^=1;
                ans[cur][0]=min(bz[u][i][0][0]+ans[cur^1][0],bz[u][i][1][0]+ans[cur^1][1]);
                ans[cur][1]=min(bz[u][i][0][1]+ans[cur^1][0],bz[u][i][1][1]+ans[cur^1][1]);
                u=fa[u][i];
            }
        }
        if (u==v)
        {
            if (ans[cur][y]+g[u][y]>=INF)
            {
                puts("-1");
                continue;
            }
            printf("%lld\n",ans[cur][y]+g[u][y]);
            continue;
        }
        anss[cur][0][y]=ans[cur][0]+f[v][y];
        anss[cur][1][y]=ans[cur][1]+f[v][y];
        anss[cur][0][y^1]=anss[cur][1][y^1]=INF;
        for (i=16;i>=0;--i)
        {
            if (fa[u][i]!=fa[v][i])
            {
                cur^=1;
                anss[cur][0][0]=min(min(bz[u][i][0][0]+bz[v][i][0][0]+anss[cur^1][0][0],
                                        bz[u][i][1][0]+bz[v][i][0][0]+anss[cur^1][1][0]),
                                    min(bz[u][i][0][0]+bz[v][i][1][0]+anss[cur^1][0][1],
                                        bz[u][i][1][0]+bz[v][i][1][0]+anss[cur^1][1][1]));
                anss[cur][0][1]=min(min(bz[u][i][0][0]+bz[v][i][0][1]+anss[cur^1][0][0],
                                        bz[u][i][1][0]+bz[v][i][0][1]+anss[cur^1][1][0]),
                                    min(bz[u][i][0][0]+bz[v][i][1][1]+anss[cur^1][0][1],
                                        bz[u][i][1][0]+bz[v][i][1][1]+anss[cur^1][1][1]));
                anss[cur][1][0]=min(min(bz[u][i][0][1]+bz[v][i][0][0]+anss[cur^1][0][0],
                                        bz[u][i][1][1]+bz[v][i][0][0]+anss[cur^1][1][0]),
                                    min(bz[u][i][0][1]+bz[v][i][1][0]+anss[cur^1][0][1],
                                        bz[u][i][1][1]+bz[v][i][1][0]+anss[cur^1][1][1]));
                anss[cur][1][1]=min(min(bz[u][i][0][1]+bz[v][i][0][1]+anss[cur^1][0][0],
                                        bz[u][i][1][1]+bz[v][i][0][1]+anss[cur^1][1][0]),
                                    min(bz[u][i][0][1]+bz[v][i][1][1]+anss[cur^1][0][1],
                                        bz[u][i][1][1]+bz[v][i][1][1]+anss[cur^1][1][1]));
                u=fa[u][i];
                v=fa[v][i];
            }
        }
        ansss=min(min(min(anss[cur][0][0],anss[cur][0][1]),min(anss[cur][1][0],anss[cur][1][1]))+g[fa[u][0]][1]+f[fa[u][0]][1]-min(f[u][0],f[u][1])-min(f[v][0],f[v][1]),anss[cur][1][1]+g[fa[u][0]][0]+f[fa[u][0]][0]-f[u][1]-f[v][1]);
        if (ansss>=INF)
        {
            puts("-1");
            continue;
        }
        printf("%lld\n",ansss);
    }
    
    return 0;
}

void dfs1(int u)
{
    int i,v;
    f[u][1]=p[u];
    for (i=head[u];i;i=nxt[i])
    {
        v=to[i];
        if (v!=fa[u][0])
        {
            fa[v][0]=u;
            dep[v]=dep[u]+1;
            dfs1(v);
            f[u][0]+=f[v][1];
            f[u][1]+=min(f[v][0],f[v][1]);
        }
    }
}

void dfs2(int u)
{
    int i,v;
    for (i=head[u];i;i=nxt[i])
    {
        v=to[i];
        if (v!=fa[u][0])
        {
            g[v][0]=g[u][1]+f[u][1]-min(f[v][0],f[v][1]);
            g[v][1]=min(g[u][0]+f[u][0]-f[v][1],g[u][1]+f[u][1]-min(f[v][0],f[v][1]));
            bz[v][0][0][1]=bz[v][0][1][1]=f[u][1]-min(f[v][0],f[v][1]);
            bz[v][0][1][0]=f[u][0]-f[v][1];
            bz[v][0][0][0]=INF;
            dfs2(v);
        }
    } 
}

void add(int u,int v)
{
    nxt[++cnt]=head[u];
    head[u]=cnt;
    to[cnt]=v;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #147.08 us84 KBAcceptedScore: 4

Testcase #255.27 us84 KBAcceptedScore: 4

Testcase #348 us84 KBAcceptedScore: 4

Testcase #455.27 us84 KBAcceptedScore: 4

Testcase #5123.17 us168 KBAcceptedScore: 4

Testcase #6127.84 us168 KBAcceptedScore: 4

Testcase #7128.15 us160 KBAcceptedScore: 4

Testcase #81.455 ms1 MB + 916 KBAcceptedScore: 4

Testcase #91.481 ms1 MB + 916 KBAcceptedScore: 4

Testcase #101.57 ms1 MB + 828 KBAcceptedScore: 4

Testcase #111.537 ms1 MB + 828 KBAcceptedScore: 4

Testcase #12135.71 ms91 MB + 508 KBAcceptedScore: 4

Testcase #13135.744 ms91 MB + 508 KBAcceptedScore: 4

Testcase #14118.615 ms91 MB + 312 KBAcceptedScore: 4

Testcase #15118.709 ms91 MB + 316 KBAcceptedScore: 4

Testcase #16118.737 ms91 MB + 316 KBAcceptedScore: 4

Testcase #17171.924 ms91 MB + 508 KBAcceptedScore: 4

Testcase #18125.142 ms83 MB + 888 KBAcceptedScore: 4

Testcase #19125.107 ms83 MB + 888 KBAcceptedScore: 4

Testcase #20127.649 ms87 MB + 308 KBAcceptedScore: 4

Testcase #21127.767 ms87 MB + 308 KBAcceptedScore: 4

Testcase #22114.963 ms87 MB + 112 KBAcceptedScore: 4

Testcase #23167.538 ms87 MB + 304 KBAcceptedScore: 4

Testcase #24167.541 ms87 MB + 308 KBAcceptedScore: 4

Testcase #25167.341 ms87 MB + 320 KBAcceptedScore: 4


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-08 17:15:14 | Loaded in 2 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠