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

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

题意:给一些边,有一些操作,每次操作,都要在这些边上加上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("\n");
}
}

CodeForces 191C 树链剖分 第4遍的更多相关文章

  1. Water Tree CodeForces 343D 树链剖分+线段树

    Water Tree CodeForces 343D 树链剖分+线段树 题意 给定一棵n个n-1条边的树,起初所有节点权值为0. 然后m个操作, 1 x:把x为根的子树的点的权值修改为1: 2 x:把 ...

  2. Codeforces Round #425 (Div. 2) Problem D Misha, Grisha and Underground (Codeforces 832D) - 树链剖分 - 树状数组

    Misha and Grisha are funny boys, so they like to use new underground. The underground has n stations ...

  3. CodeForces - 343D 树链剖分

    题目链接:http://codeforces.com/problemset/problem/343/D 题意:给定一棵n个n-1条边的树,起初所有节点权值为0,然后m个操作. 1 x:把x为根的子树的 ...

  4. Educational Codeforces Round 3 E. Minimum spanning tree for each edge (最小生成树+树链剖分)

    题目链接:http://codeforces.com/contest/609/problem/E 给你n个点,m条边. 问枚举每条边,问你加这条边的前提下组成生成树的权值最小的树的权值和是多少. 先求 ...

  5. Codeforces Round #329 (Div. 2) D. Happy Tree Party 树链剖分

    D. Happy Tree Party Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/593/p ...

  6. 【Codeforces】【网络流】【树链剖分】【线段树】ALT (CodeForces - 786E)

    题意 现在有m个人,每一个人都特别喜欢狗.另外还有一棵n个节点的树. 现在每个人都想要从树上的某个节点走到另外一个节点,且满足要么这个人自带一条狗m,要么他经过的所有边h上都有一条狗. 2<=n ...

  7. Codeforces 704E Iron Man [树链剖分,计算几何]

    Codeforces 这题--真是搞死我了-- 好不容易下定了决心要不颓废,要写题,结果一调就调了十几个小时-- 思路 我们发现在树上做非常不舒服,于是树链剖分之后一次在重链上的移动就可以看做是在df ...

  8. D. Happy Tree Party CodeForces 593D【树链剖分,树边权转点权】

    Codeforces Round #329 (Div. 2) D. Happy Tree Party time limit per test 3 seconds memory limit per te ...

  9. Codeforces 343D Water Tree & 树链剖分教程

    原题链接 题目大意 给定一棵根为1,初始时所有节点值为0的树,进行以下三个操作: 将以某点为根的子树节点值都变为1 将某个节点及其祖先的值都变为0 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...

随机推荐

  1. kinect for windows - SkeletonBasics-D2D详解之二

    首先看骨骼追踪例子代码的结构:

  2. HDU 1501 Zipper 动态规划经典

    Zipper Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. return view详解(转载)

    1.return View(); 返回值 类型:System.Web.Mvc.ViewResult将视图呈现给响应的 View() 结果. 注释 View() 类的此方法重载将返回一个具有空 View ...

  4. 关于Spring的BeanPostProcessor

    BeanPostProcessor接口作用是:如果我们需要在Spring容器完成Bean的实例化.配置和其他的初始化前后添加一些自己的逻辑处理,我们就可以定义一个或者多个BeanPostProcess ...

  5. java执行windows 的cmd 命令

    //获取运行时 Runtime rt = Runtime.getRuntime(); //获取进程 Process p = rt.exec(String[] cmdarray);     或者   P ...

  6. NSString 用法大全。

    一.NSString 创建字符串.  NSString *astring = @"This is a String!"; 创建空字符串,给予赋值.  NSString *astri ...

  7. django cbv

    django 提供了一系列现成的类视图,他们都继承自一个 View 基类(django.views.generic.base.View).在这个基类里实现了与 URLs 的接口(as_view).请求 ...

  8. orcad10.5启动加速

    OrCAD不知道怎么滴,启动速度慢的让人崩溃!30秒算快的,有时候甚至几分钟,要么需要连续开N次才打开,苦啊!!经过网上无数文章的洗礼,无数次的尝试,终于得出一种特效方法! 原因:OrCAD启动时在电 ...

  9. android linearlayout 把控件view置底部(放在页面最下方)

    <LinearLayout android:id="@+id/recLayout" android:layout_width="fill_parent" ...

  10. 性能超越 Redis 的 NoSQL 数据库 SSDB

    idea's blog - 性能超越 Redis 的 NoSQL 数据库 SSDB 性能超越 Redis 的 NoSQL 数据库 SSDB C/C++语言编程, SSDB Views: 8091 | ...