zoukankan      html  css  js  c++  java
  • 洛谷P4374

    又是一个板子题。

    边权转点权注意要去除lca,修改时直接将id[x]加一即可。

    注意若此时x==y,则直接返回。

    代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    #define inf 2147483647
    const int maxn=1e6;
    int n,m;
    inline int read(){
        int x=0,f=1;
        char c=getchar();
        while(c<'0'||c>'9'){
            if(c=='-')f=-1;
            c=getchar();
        }
        while(c>='0'&&c<='9'){
            x=(x<<1)+(x<<3)+c-'0';
            c=getchar();
        }
        return x*f;
    }
    int beg[maxn],nex[maxn],to[maxn],e;
    inline void add(int x,int y){
        e++;nex[e]=beg[x];
        beg[x]=e;to[e]=y;
    }
    int xx[maxn],yy[maxn];
    int son[maxn],size[maxn],dep[maxn],fa[maxn];
    inline void dfs1(int x,int anc){
        dep[x]=dep[anc]+1;
        fa[x]=anc;
        size[x]=1;
        for(int i=beg[x];i;i=nex[i]){
            int t=to[i];
            if(t==anc)continue;
            dfs1(t,x);
            size[x]+=size[t];
            if(size[t]>size[son[x]])
                son[x]=t;
        }
    }
    int id[maxn],top[maxn],cnt;
    inline void dfs2(int x,int topc){
        id[x]=++cnt;
        top[x]=topc;
        if(!son[x])return;
        dfs2(son[x],topc);
        for(int i=beg[x];i;i=nex[i]){
            int t=to[i];
            if(t==fa[x]||t==son[x])
                continue;
            dfs2(t,t);
        }
    }
    int tr[maxn],lazy[maxn];
    inline void pushup(int h,int z){
        tr[h]=min(tr[h],z);
        lazy[h]=min(lazy[h],z);
    }
    inline void pushdown(int h){
        if(lazy[h]==inf)return;
        pushup(h<<1,lazy[h]);
        pushup(h<<1|1,lazy[h]);
        lazy[h]=inf;
    }
    inline void modify(int h,int l,int r,int x,int y,int z){
        if(l>y||r<x)return;
        if(l>=x&&r<=y){
            pushup(h,z);
            return;
        }
        pushdown(h);
        int mid=(l+r)>>1;
        modify(h<<1,l,mid,x,y,z);
        modify(h<<1|1,mid+1,r,x,y,z);
        //tr[h]=min(tr[h<<1],tr[h<<1|1]);
    }
    inline void mc(int x,int y,int z){
        while(top[x]!=top[y]){
            if(dep[top[x]]<dep[top[y]])swap(x,y);
            modify(1,1,n,id[top[x]],id[x],z);
            x=fa[top[x]];
        }
        if(x==y)return;
        if(dep[x]>dep[y])swap(x,y);
        modify(1,1,n,id[x]+1,id[y],z); 
    }
    /*
    inline void build(int h,int l,int r){
        tr[h]=lazy[h]=inf;
        if(l==r)return;
        int mid=(l+r)>>1;
        build(h<<1,l,mid);
        build(h<<1|1,mid+1,r);
    }
    */
    inline int query(int h,int l,int r,int x){
        if(l==r)return tr[h];
        int mid=(l+r)>>1;
        pushdown(h);
        if(mid>=x)return query(h<<1,l,mid,x);
        else return query(h<<1|1,mid+1,r,x);
    }
    int main(){
        //freopen("p.in","r",stdin);
        n=read(),m=read();
        for(int i=0;i<=10*n;i++)
            tr[i]=lazy[i]=inf;
        for(int i=1;i<n;i++){
            xx[i]=read();
            yy[i]=read();
            add(xx[i],yy[i]);
            add(yy[i],xx[i]);
        }
        dfs1(1,0);
        dfs2(1,1);
        //build(1,1,n);
        int x,y,z;
        for(int i=1;i<=m;i++){
            x=read(),y=read(),z=read();
            mc(x,y,z);
        }
        int AC=0,WA=0;
        for(int i=1;i<n;i++){
            if(dep[xx[i]]<dep[yy[i]])swap(xx[i],yy[i]);
            int tmp=query(1,1,n,id[xx[i]]);
            tmp=(tmp==inf)?-1:tmp;
            printf("%d
    ",tmp);
            /*x=read();
            if(x==tmp)AC++;
            else WA++,printf("%d %d
    ",x,tmp);
            //printf("%d
    ",tmp==inf?-1:tmp);
            */
        }
        //printf("%d %d
    ",AC,WA);
        return 0;
    }
  • 相关阅读:
    Spring Boot学习——AOP编程的简单实现
    Spring Boot学习——表单验证
    Spring Boot学习——数据库操作及事务管理
    Spring Boot学习——Controller的使用
    Spring Boot学习——Spring Boot配置文件application
    Spring Boot学习——第一个Spring Boot程序
    Spring Boot学习——Spring Boot简介
    activeMQ队列模式和主题模式的Java实现
    Markdown语法格式
    Java基础知识系列——Exception
  • 原文地址:https://www.cnblogs.com/syzf2222/p/12386730.html
Copyright © 2011-2022 走看看