CodeForces 191C 树链剖分 第4遍

来源:互联网 发布:a算法八数码 编辑:程序博客网 时间:2024/06/13 06:19

很无奈,模板又一次无奈的打错了。。不过,很快便找到了。。

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

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define lson id << 1#define rson id << 1|1const 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("\n");    }}


0 0
原创粉丝点击