zoukankan      html  css  js  c++  java
  • hdu 5029树链剖分

    /*
    解:标记区间端点,按深度标记上+下-。
    然后用线段树维护求出最小的,再将它映射回来
    */
    #pragma comment(linker, "/STACK:102400000,102400000")
    #include<stdio.h>
    #include<string.h>
    #include<vector>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define N  100500
    struct node {
    int u,v,next;
    }bian[N*2];
    int f[N],top[N],fp[N],siz[N],son[N],fa[N],head[N],yong;
    int deep[N],cnt;
    vector<int>add[N],stra[N];
    void init() {
    yong=0;cnt=0;
    memset(head,-1,sizeof(head));
    memset(son,-1,sizeof(son));
    }
    void addedge(int u,int v) {
     bian[yong].u=u;
     bian[yong].v=v;
     bian[yong].next=head[u];
     head[u]=yong++;
    }
    void dfs1(int u,int father,int d) {
      deep[u]=d;
      fa[u]=father;
      siz[u]=1;
      int i;
      for(i=head[u];i!=-1;i=bian[i].next) {
        int v=bian[i].v;
        if(v!=father) {
            dfs1(v,u,d+1);
           siz[u]+=siz[v];
           if(son[u]==-1||siz[son[u]]<siz[v])
            son[u]=v;
        }
      }
      return ;
    }
    void dfs2(int u,int tp) {
       f[u]=++cnt;
       fp[f[u]]=u;
       top[u]=tp;
       if(son[u]==-1)return ;
         dfs2(son[u],tp);
         int i;
         for(i=head[u];i!=-1;i=bian[i].next) {
            int v=bian[i].v;
            if(v!=son[u]&&v!=fa[u])//u写成v了
                dfs2(v,v);
         }
         return ;
    }
    void update(int u,int v,int w) {
        int f1=top[u];
       int f2=top[v];
       while(f1!=f2) {
           if(deep[f1]<deep[f2]) {
                swap(f1,f2);swap(u,v);
            }
        add[f[f1]].push_back(w);
        stra[f[u]].push_back(w);
        u=fa[f1];
        f1=top[u];
        }
       if(deep[u]>deep[v])
       swap(u,v);
       add[f[u]].push_back(w);
      stra[f[v]].push_back(w);
       return ;
    }
    struct nodee{
    int l,r,node,num;
    }tree[N*4];
    void pushdown(int t) {
      if(tree[t*2].num>=tree[t*2+1].num) {
        tree[t].num=tree[t*2].num;
        tree[t].node=tree[t*2].node;
      }
      else {
        tree[t].num=tree[t*2+1].num;
        tree[t].node=tree[t*2+1].node;
      }
      return ;
    }
    void build(int t,int l,int r) {
       tree[t].l=l;
       tree[t].r=r;
       if(l==r){
           // printf("%d
    ",l);
        tree[t].node=l;
        tree[t].num=0;
        return ;
       }
       int mid=(l+r)/2;
       build(t*2,l,mid);
       build(t*2+1,mid+1,r);
       pushdown(t);
       return ;
    }
    void qury(int t,int k,int nu) {
       if(tree[t].l==tree[t].r) {
        tree[t].num+=nu;
       // printf("")
        return ;
       }
       int mid=(tree[t].l+tree[t].r)/2;
       if(k<=mid)
        qury(t*2,k,nu);
       else
        qury(t*2+1,k,nu);
       pushdown(t);
      // printf("%d %d %d
    ",tree[t].l,tree[t].r,tree[t].node);
    }
    int answer[N];
    int Max(int v,int vv) {
    return v>vv?v:vv;
    }
    int main() {
       int n,m,i,j,u,v,w,mxx;
       while(scanf("%d%d",&n,&m),n||m) {
        init();
        for(i=1;i<n;i++) {
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }
        dfs1(1,1,0);
        dfs2(1,1);
      //  printf("f[2]=%d
    ",f[2]);
        for(i=1;i<=n;i++)
      add[i].clear(),stra[i].clear();
        mxx=0;
        while(m--) {
            scanf("%d%d%d",&u,&v,&w);
            update(u,v,w);
            mxx=Max(mxx,w);
        }
          build(1,0,mxx);
           for(i=1;i<=n;i++) {
            int len=add[i].size();
         //   printf("%d
    ",len);
            for(j=0;j<len;j++) {
           //     printf("%d=%d
    ",i,add[i][j]);
                qury(1,add[i][j],1);
            }
            answer[fp[i]]=tree[1].node;
          // printf("%d %d
    ",tree[1].node,tree[1].num);
            len=stra[i].size();
               // printf("stralen=%d
    ",len);
            for(j=0;j<len;j++) {
          //   printf("st%d=%d
    ",i,stra[i][j]);
                qury(1,stra[i][j],-1);
            }
             add[i].clear(),stra[i].clear();
        }
        for(i=1;i<=n;i++)
            printf("%d
    ",answer[i]);
       }
    return 0;}
    

  • 相关阅读:
    类名+函数名(参数1,参数2.....){.......return this;}
    报错!无法从静态上下文中引用非静态 变量
    ERROR无法从静态上下文中引用非静态变量
    字符编码笔记:ASCII,Unicode和UTF-8
    MySQL其他类型常用函数
    MySQL流程函数
    MySQL日期和时间函数
    MySQL数值函数
    MySQL字符串函数
    MySQL位运算符优先级
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410582.html
Copyright © 2011-2022 走看看