zoukankan      html  css  js  c++  java
  • CodeForces 191C 树链剖分 第4遍

    非常无奈,模板重新无奈的打错了。。

    只是,非常快便找到了。。

    题意:给一些边,有一些操作,每次操作,都要在这些边上加上1,求每一个边的边权。。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    #define lson id << 1
    #define rson id << 1|1
    const int M = 100008;
    int top[M],siz[M],son[M],father[M],ti[M],dep[M];
    int e[M][2],idx,tp;
    struct {
        int head;
    }H[M];
    struct{
        int v,next;
    }E[M*2];
    void init(){
        memset(H,-1,sizeof(H));
        memset(E,-1,sizeof(E));
        tp = 0,idx = 0;
    }
    void add(int u,int v){
        E[tp].v =v;
        E[tp].next = H[u].head;
        H[u].head = tp++;
    }
    void dfs_1(int u,int fa){
        son[u] = 0;siz[u] = 1;father[u] = fa;dep[u] = dep[fa] + 1;
        for(int i=H[u].head;i!=-1;i=E[i].next){
            int v = E[i].v;
            if(v == fa)continue;
            dfs_1(v,u);
            siz[u] += siz[v];
            if(siz[v] > siz[son[u]])son[u] = v;
        }
    }
    void dfs_2(int u,int fa){
        ti[u] = idx++;
        top[u] = fa;
        if(son[u])dfs_2(son[u],fa);
        for(int i=H[u].head;i!=-1;i=E[i].next){
            int v = E[i].v;
            if(v == father[u]|| v == son[u])continue;
            dfs_2(v,v);
        }
    }
    struct M_tree{
        int mark,l,r;
        int mid(){
            return (l+r) /2;
        }
    }node[M*4];
    void  build_tree(int id,int l,int r){
        node[id].l = l;node[id].r = r;node[id].mark = 0;
    
        if(l == r)return;
        int mid = node[id].mid();
        build_tree(lson,l,mid);
        build_tree(rson,mid+1,r);
    }
    void push_down(int id){
        if(node[id].l == node[id].r)return;
        if(node[id].mark){
            node[lson].mark += node[id].mark ;
            node[rson].mark += node[id].mark ;
            node[id].mark = 0;
        }
    }
    
    void nede(int id,int l,int r){
    
        if(node[id].l == l&&node[id].r == r){
    
            node[id].mark += 1;
            return;
        }
        push_down(id);
        int mid = node[id].mid();
        if(r <=mid)nede(lson,l,r);
        else if(l > mid)nede(rson,l,r);
        else{
            nede(lson,l,mid);
            nede(rson,mid+1,r);
        }
    }
    int ans = 0;
    int query(int id,int r){
    
        if( node[id].l == r&&node[id].r == r)return node[id].mark;
        push_down(id);
        int mid= node[id].mid();
        if(r <=mid)return query(lson,r);
        else return query(rson,r);
    }
    void negat(int u,int v){
        int f1 = top[u];
        int f2 = top[v];
    
        while(f1 != f2){
            if(dep[f1] < dep[f2]){
                swap(f1,f2);
                swap(u,v);
            }//cout << ti[f1] << "<---->" << ti[u]<<endl;
            nede(1,ti[f1],ti[u]);
            u = father[f1];f1 = top[u];
        }
        if(u == v)return;
        if(dep[u] > dep[v])swap(u,v);
        nede(1,ti[son[u]],ti[v]);
    }
    int main()
    {
        int u,v,n,m;
        while(~scanf("%d",&n)){
                init();
           for(int i=0;i<n-1;i++){
            scanf("%d%d",&e[i][0],&e[i][1]);
            add(e[i][0],e[i][1]);
            add(e[i][1],e[i][0]);
    
           }
           dfs_1(1,1);
           dfs_2(1,1);
           build_tree(1,0,idx-1);
    //cout <<idx<<endl;
           scanf("%d",&m);
           while(m--){
                scanf("%d%d",&u,&v);
    
                negat(u,v);
           }
           for(int i=0;i<n-1;i++)
           {
               if(dep[e[i][0]] > dep[e[i][1]]){
                swap(e[i][0],e[i][1]);
               }
           }
           for(int i=0;i<n-1;i++){
                printf("%d",query(1,ti[e[i][1]]));
                if(i!=n-2)printf(" ");
           }
           printf("
    ");
        }
    }
    


  • 相关阅读:
    angularjs中的指令
    git笔记
    webpack.config.js
    webpack开发react常用插件和依赖
    angularjs中的分页指令
    angularjs中的排序和过滤
    react学习
    gulp学习
    Javascript 判断变量类型的陷阱 与 正确的处理方式
    Fn.bind.apply() 解决 new 操作符不能用与 apply 或 call 同时使用
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5173773.html
Copyright © 2011-2022 走看看