zoukankan      html  css  js  c++  java
  • P4556 雨天的尾巴

    题面

    https://www.luogu.org/problem/P4556

    题解

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<vector>
    #include<algorithm>
    #define ri register int
    #define Rb 100000
    
    using namespace std;
    
    
    int cnt=0,val[10000000],ch[10000000][2],mx[10000000],sum[10000000];
    vector<int> to[100050];
    
    int n,m,fa[100050],root[100050],f[100050][20],dep[100050];
    
    void dfs(int x,int ff,int d) {
      f[x][0]=fa[x]=ff; dep[x]=d;
      for (ri i=1;i<=17;i++) f[x][i]=f[f[x][i-1]][i-1];
      for (ri i=to[x].size()-1;i>=0;i--) if (to[x][i]!=ff) {
        dfs(to[x][i],x,d+1);
      }
    }
    
    int Lca(int u,int v) {
      if (dep[u]<dep[v]) swap(u,v);
      for (ri i=17;i>=0;i--) if (dep[f[u][i]]>=dep[v]) u=f[u][i];
      if (u==v) return u;
      for (ri i=17;i>=0;i--) if (f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
      return fa[u];
    }
    
    void pushup(int x) {
      int lsum=0,rsum=0;
      if (ch[x][0]) lsum=sum[ch[x][0]];
      if (ch[x][1]) rsum=sum[ch[x][1]];
      if (lsum<rsum && rsum>0) {
        mx[x]=mx[ch[x][1]];
        sum[x]=rsum;
        return;
      }
      if (lsum>=rsum && lsum>0) {
        mx[x]=mx[ch[x][0]];
        sum[x]=lsum;
        return;
      }
      mx[x]=0;
    }
    
    void insert(int &x,int loc,int opt,int l,int r) {
      if (!x) x=++cnt;
      ri mid=(l+r)>>1;
      if (l==r) {
        sum[x]+=opt;
        mx[x]=l;
        return;
      }
      if (loc<=mid) insert(ch[x][0],loc,opt,l,mid); else insert(ch[x][1],loc,opt,mid+1,r);
      pushup(x);
    }
    
    void merge(int &u,int v,int l,int r) {
      if (!v) return;
      if (!u) {u=v;return;}
      if (l==r) {sum[u]+=sum[v]; mx[u]=l; return;}
      int mid=(l+r)>>1;
      merge(ch[u][0],ch[v][0],l,mid);
      merge(ch[u][1],ch[v][1],mid+1,r);
      pushup(u);
    }
    
    void treesum(int x) {
      for (ri i=to[x].size()-1;i>=0;i--) if (to[x][i]!=fa[x]) {
        treesum(to[x][i]);
        merge(root[x],root[to[x][i]],1,Rb);
      }
    }
    
    void calc(int x,int l,int r){
      if (!x) return;
      printf("%d %d %d %d %d
    ",x,l,r,sum[x],mx[x]);
      calc(ch[x][0],l,(l+r)/2);
      calc(ch[x][1],(l+r)/2+1,r);
    }
    
    int main() {
      cnt=0;
      int u,v,x,y,z;
      scanf("%d %d",&n,&m);
      for (ri i=1;i<n;i++) {
        scanf("%d %d",&u,&v);
        to[u].push_back(v); to[v].push_back(u);
      }
      dfs(1,1,1);
      for (ri i=1;i<=n;i++) root[i]=i;
      cnt=n;
      for (ri i=1;i<=m;i++) {
        scanf("%d %d %d",&x,&y,&z);
        insert(root[x],z,1,1,Rb);
        insert(root[y],z,1,1,Rb);
        int lca=Lca(x,y);
        insert(root[lca],z,-1,1,Rb);
        if (lca!=1) insert(root[fa[lca]],z,-1,1,Rb);
      }
      treesum(1);
      for (ri i=1;i<=n;i++) {
        printf("%d
    ",mx[root[i]]);
      }
    }
  • 相关阅读:
    matlab中关于使用length导致的不稳定状况。
    matlab 批量读入文件夹中的指定文件类型 (目录级数不限)
    matlab中的图像裁剪,图像抽取,反转,镜像。
    反锐化掩模 unsharp masking【转载】
    matlab 将图像切分为N*N像素的小块
    Python2.7.3 Tkinter Entry(文本框) 说明
    基于JQuery的列表拖动排序
    MAC如何删除开机自启动程序
    MAC配置SVN服务器
    关于MAC清倒废纸篓,项目正在使用
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11427210.html
Copyright © 2011-2022 走看看