首页 > 其他分享 >保卫王国

保卫王国

时间:2023-09-19 18:48:00浏览次数:38  
标签:min int na fa 保卫 sa sizeof 王国

保卫王国

image-20230919182149255

image-20230919182231066 image-20230919182547776

w的定义类似于上图。

并且上图是其中一类特殊情况。

image-20230919182734409

剩余状态的例图,主义这是 \(LCA:p\) 不选的情况,选的情况也是类似的。

减去 \(f_v\) 就是 在原有的 \(f_u\) 中去掉子树 \(v\) 的贡献,也可用新的 \(s\) 替换。

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define Ed for(int i=h[x];~i;i=ne[i])
#define Ls(i,l,r) for(int i=l;i<r;++i)
#define Rs(i,l,r) for(int i=l;i>r;--i)
#define Le(i,l,r) for(int i=l;i<=r;++i)
#define Re(i,l,r) for(int i=l;i>=r;--i)
#define L(i,l) for(int i=0;i<l;++i)
#define E(i,l) for(int i=1;i<=l;++i)
#define W(t) while(t--)
#define Wh while
typedef long long ll;
const int N=100010,M=17,MM=2*N;
ll f[N][2],g[N][2],w[N][M][2][2];
int n,m,fa[N][M],p[N],dep[N];
int h[N],e[MM],ne[MM],idx;//don't forget memset h!
void add(int a,int b){
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs_f(int x,int fa){
    f[x][1]=p[x];
    Ed{
        int j=e[i];
        if(j==fa)continue;
        dfs_f(j,x);
        f[x][0]+=f[j][1];
        f[x][1]+=min(f[j][0],f[j][1]);
    }
}
void dfs_g(int x,int fa){
    Ed{
        int j=e[i];
        if(j==fa)continue;
        g[j][0]=f[x][1]+g[x][1]-min(f[j][0],f[j][1]);
        g[j][1]=min(g[j][0],f[x][0]+g[x][0]-f[j][1]);
        dfs_g(j,x);
    }
}
void dfs_fa(int x,int fat){
    Ed{
        int j=e[i];
        if(j==fat)continue;
        dep[j]=dep[x]+1;
        fa[j][0]=x;
        Ls(k, 1, M)fa[j][k]=fa[fa[j][k-1]][k-1];
        dfs_fa(j,x);
    }
}
void dfs_w(int x,int fat){
    Ed{
        int j=e[i];
        if(j==fat)continue;
        w[j][0][0][1]=w[j][0][1][1]=f[x][1]-min(f[j][0],f[j][1]);
        w[j][0][1][0]=f[x][0]-f[j][1];
        Ls(k, 1, M)
            L(x, 2)
                L(y, 2)
                    L(z, 2)w[j][k][x][y]=min(w[j][k][x][y],w[j][k-1][x][z]+w[fa[j][k-1]][k-1][z][y]);
        dfs_w(j,x);
    }
}
ll calc(int a,int x,int b,int y){
    if(dep[a]<dep[b])swap(a,b),swap(x,y);
    if(!x&&!y&&fa[a][0]==b)return -1;
    ll na[2],nb[2],sa[2],sb[2];
    memset(sa,0x3f,sizeof sa);
    memset(sb,0x3f,sizeof sb);
    sa[x]=f[a][x],sb[y]=f[b][y];
    Re(i, M-1, 0)
        if(dep[fa[a][i]]>=dep[b]){
            memset(na,0x3f,sizeof na);
            L(x, 2)
                L(y, 2)na[y]=min(na[y],sa[x]+w[a][i][x][y]);
            memcpy(sa,na,sizeof sa);
            a=fa[a][i];
        }
    if(a==b)return g[b][y]+sa[y];
    Re(i, M-1, 0)
        if(fa[a][i]!=fa[b][i]){
            
            memset(na,0x3f,sizeof na);
            memset(nb,0x3f,sizeof nb);
            L(x, 2)
                L(y, 2)
                na[y]=min(na[y],sa[x]+w[a][i][x][y]),
                nb[y]=min(nb[y],sb[x]+w[b][i][x][y]);
            memcpy(sa,na,sizeof sa);
            memcpy(sb,nb,sizeof sb);
            a=fa[a][i],b=fa[b][i];
        }
    int lca=fa[a][0];
    ll res0=f[lca][0]+g[lca][0]-f[a][1]-f[b][1]+sa[1]+sb[1];
    ll res1=f[lca][1]+g[lca][1]-min(f[a][1],f[a][0])-min(f[b][1],f[b][0])+min(sa[0],sa[1])+min(sb[0],sb[1]);
    return min(res0,res1);
}
int main(){
    #ifndef ONLINE_JUDGE
    freopen("1.in","r",stdin);
    #endif
    scanf("%d%d%*s",&n,&m);
    memset(h,-1,n*4+4);
    E(i, n)scanf("%d",p+i);
    E(i, n-1){
        int a,b;
        scanf("%d%d",&a,&b);
        add(a,b),add(b,a);
    }
    dfs_f(1,-1);
    dfs_g(1,-1);
    dep[1]=1;
    dfs_fa(1,-1);
    memset(w,0x3f,sizeof w);
    dfs_w(1,-1);
    W(m){
        int a,x,b,y;
        scanf("%d%d%d%d",&a,&x,&b,&y);
        printf("%lld\n",calc(a,x,b,y));
    }
    return 0;
}

标签:min,int,na,fa,保卫,sa,sizeof,王国
From: https://www.cnblogs.com/wscqwq/p/17715479.html

相关文章

  • JavaScript王国里的鸭子合唱团
    编程语言按照数据类型大体可以分为两类,一类是静态类型语言,另一类是动态类型语言。静态类型语言在编译时便已确定变量的类型,而动态类型语言的变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。静态类型语言的优点首先是在编译时就能发现类型不匹配的错误,编辑......
  • kafka的使用—系统保卫战
    前言最近有个需求,在不同的系统中做数据同步。我们是java+mysql、他们是c#+sqlserver。需求是sqlserver提出的,并且他们提出要实时,并且要我们主动推数据给他们。他们接口都提供好了,说要我们对数据库表操作的时候调用他们的接口把数据传他们。咋看没有什么事,不就是一个接口的调用么。......
  • 5人5月用容器技术保卫蓝天
    摘要:让我们走进四川国蓝中天与华为云的合作案例,一起看看容器技术是如何保卫蓝天的。本文分享自华为云社区《锚定云原生发展!华为云DTSE助力国蓝中天破解容器难题》,作者:华为云赋能云团队四川鲲鹏&欧拉生态创新中心。“一旦发现区域内的污染源,就会精准锁定、自动派单、闭环监管。”......
  • 5人5月用容器技术保卫蓝天
    摘要:让我们走进四川国蓝中天与华为云的合作案例,一起看看容器技术是如何保卫蓝天的。本文分享自华为云社区《锚定云原生发展!华为云DTSE助力国蓝中天破解容器难题》,作者:华为云赋能云团队四川鲲鹏&欧拉生态创新中心。“一旦发现区域内的污染源,就会精准锁定、自动派单、闭环监管......
  • 咚咚咚,你的王国之泪已上线「GitHub 热点速览」
    本周最大的热点,莫过于Mojo语言了,几大媒体均有报道这门兼顾Python优点和性能的新语言。当然还有凭借Switch游戏《塞尔达传说·王国之泪》登上热榜,获得3,500+star的Switch模拟器Ryujinx。当然,还有一些日常工作可能用到的测试工具gitleaks、网页加速qwik,处理数据的c......
  • Three.js 进阶之旅:页面平滑滚动-王国之泪
    声明:本文涉及图文和模型素材仅用于个人学习、研究和欣赏,请勿二次修改、非法传播、转载、出版、商用、及进行其他获利行为。摘要浏览网页时,常被一些基于鼠标滚轮控制的页面动画所惊艳到,比如greensock官网这些showcase案例页面就非常优秀,它们大多数都是使用Tween.js、gasp......
  • 使用python完成一个射击类游戏“小黄人保卫战”
    1.项目开发环境下载Python且保证能够正常工作,为了能用Python来写一个游戏,需要安装PyGame。PyGame是一个Python的库,能够让我们容易的写出一个游戏。它提供的功能包括图片处理和声音重放的功能,并且它们能很容易的整合进你的游戏里。2.项目功能介绍通过设计一款塔防游戏“小黄......
  • 走向必然王国:如何有把握地构建 GStreamer 管道?
    本文转载自许野平的博客版权声明:本文为博主原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接和本声明。GStreamer是一款非常优秀的媒体流构建工具。由于......
  • react-native仿写洛克王国手游版
    首先声明此项目完全是出于学习和对洛克王国的喜爱而生,项目中使用的游戏宠物若涉及侵权请联系我前两天和朋友聊天说到洛克王国没有手游,正好最近在学习react-native,觉得可以尝......
  • (存档)王国保卫战4中击碎城墙的计算
    Inthefirstimage,weareableseeVez'nandestroysthewallofacastle.Itisfrom10:38ofthisvideoQQ图片20221016091453.pnghttps://www.youtube.com/watc......