其实这道题和以前在poj上做过的将树映射到树状数组的题目很像

首先不难想到,将一条边从土路修成公路,只对以这条边连接的孩子结点为根的子树有影响;

于是和之前那道poj的题目很像,后序遍历树,对每个节点重标号,每个点初始值就是深度

下面的问题就变成了:

土路修成公路---->区间修改

查询从点1到某个点所经过的土路数----->单点求值;

这种问题我们其实可以用树状数组来做;

a[i]表示原数组的值;

令c[i]=a[i]-a[i-1],特殊的c[1]=a[1];

然后我们对c数组做树状数组

区间修改(假设是[l,r]都+1)就是c[l]+1,c[r+1]-1;

单点求值就是求signma(c[1~i])

当然后来知道其实用dfs序更简单

 type node=record
       point,next:longint;
     end; var fa,a,c,p,r,h,d:array[..] of longint;
    edge:array[..] of node;
    len,n,m,x,y,t,i:longint;
    ch:char; procedure add(x,y:longint);
  begin
    inc(len);
    edge[len].point:=y;
    edge[len].next:=p[x];
    p[x]:=len;
  end; function lowbit(x:longint):longint;
  begin
    exit(x and (-x));
  end; procedure work(x,f:longint);
  begin
    while x<=n do
    begin
      inc(a[x],f);
      x:=x+lowbit(x);
    end;
  end; function ask(x:longint):longint;
  begin
    ask:=;
    while x> do
    begin
      ask:=ask+a[x];
      x:=x-lowbit(x);
    end;
  end; procedure dfs(x,d:longint);
  var i,y,tmp:longint;
  begin
    i:=p[x];
    c[x]:=d;
    tmp:=n+;
    while i<>- do
    begin
      y:=edge[i].point;
      if (c[y]=) and (y<>) then
      begin
        fa[y]:=x;
        dfs(y,d+);
        if tmp>h[y] then tmp:=h[y];
      end;
      i:=edge[i].next;
    end;
    inc(t);
    r[x]:=t;
    if tmp=n+ then h[x]:=r[x]
    else h[x]:=tmp;
  end; begin
  len:=-;
  fillchar(p,sizeof(p),);
  readln(n);
  for i:= to n- do
  begin
    readln(x,y);
    add(x,y);
    add(y,x);
  end;
  t:=;
  dfs(,);
  for i:= to n do
    d[r[i]]:=c[i];
  for i:= to n do
    work(i,d[i]-d[i-]);
  work(,d[]);
  readln(m);
  for i:= to n+m- do
  begin
    read(ch);
    if ch='W' then
    begin
      readln(x);
      writeln(ask(r[x]));
    end
    else begin
      readln(x,y);
      if fa[x]=y then t:=x else t:=y;
      work(h[t],-);
      work(r[t]+,);
    end;
  end;
end.

bzoj1103的更多相关文章

  1. BZOJ1103 [POI2007]大都市meg dfs序 线段树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1103 题意概括 一棵树上,一开始所有的边权值为1,我们要支持两种操作: 1. 修改某一条边的权值为 ...

  2. 【BZOJ1103】大都市meg(DFS序,树状数组)

    题意:有一颗树,1号点为根,保证编号小的点深度较小,初始状态每条边都没有被标记,要求实现两个操作在线: A:将连接x,y的边标记 W:查询从1到x的路径上有多少条边未被标记 n<=2*10^5 ...

  3. [bzoj1103][POI2007]大都市meg_dfs序_树状数组

    大都市meg bzoj-1103 POI-2007 题目大意:给定一颗n个点的树,m次操作.将一条路的边权更改成0:查询一个点到根节点的点权和.开始的时候所有边的边权都是1. 注释:$1\le n,m ...

  4. bzoj1103树状数组水题

    (卧槽,居然规定了修改的两点直接相连,亏我想半天) 非常水的题,用dfs序(而且不用重复,应该是直接规模为n的dfs序)+树状数组可以轻松水 收获:树状数组一遍A(没啥好骄傲的,那么简单的东西) #i ...

  5. 【BZOJ-1103】大都市meg 树状数组 + DFS序

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2009  Solved: 1056[Submit][Sta ...

  6. bzoj1103: [POI2007]大都市meg

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1103 题目大意:在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Ma ...

  7. BZOJ1103[POI2007]大都市meg 题解

    题目大意: 有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和:2.将一条边的权值改为0. 思路: 用dfs序将树化为序列,在dfs序中我们会保存 ...

  8. [bzoj1103][POI2007]大都市meg(树状数组+dfs序)

    1103: [POI2007]大都市meg Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2031  Solved: 1069[Submit][Sta ...

  9. BZOJ1103 [POI2007]大都市meg(DFS序)

    题目:一颗树,单边修改,链上查询..实际上链是根到结点的链.网上好像有其他做法,我的想法是这样的: 先不看修改,毫无疑问查询只是查询结点的深度:而修改一条边会有什么影响:影响是且只是以边上深度最深结点 ...

随机推荐

  1. NOIP(提高组)DAY1国王游戏

    问题描述 恰逢H国国庆,国王邀请n位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这n位大臣排成一排,国王站在队伍的最前面.排好队 ...

  2. How do I create an installation log?

    Quote from: http://www.advancedinstaller.com/user-guide/qa-log.html Windows Installer logging Window ...

  3. Java 与 Python 的对比

    最近在学习Python, 现在写一个Python程序和Java程序进行对一下比,以此展示各自不同的特点.这个程序的功能是计算([n, m) )之间的闰年.     Python程序如下: def fu ...

  4. 程序员面试题精选100题(38)-输出1到最大的N位数[算法]

    作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:输入数字n,按顺序输出从1最大的n位10进制数.比如输入3,则输出1.2.3一直到最大的3位数即999. 分析:这 ...

  5. linux shell编程学习笔记(二) --- grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  6. EF 的 霸气配置

    通过EF 作为操作数据库的工具有一段时间了,也做了几个相对不大的项目,慢慢的也对EF的使用摸索出来了一些规则,虽然说不是技术难点,但是,我说的是但是,能够提高我们开发效率的棉花糖有时我们还是必须要吃的 ...

  7. switch...case 和 if...else

    switch...case与if...else的根本区别在于: switch...case会生成一个跳转表来指示实际的case分支的地址,而这个跳转表的索引号与switch变量的值是相等的,switc ...

  8. Django视图与网址传参

    目的:采用/add?a=1&b=2  这样get/post方法进行 修改一下mysite/views.py文件 from django.shortcuts import renderfrom ...

  9. Popen No such file or directory 错误

    File , in reload_config stderr=PIPE, env={"PATH": '', "HOME": "/root"} ...

  10. Codeforces Round #360 div2

    Problem_A(CodeForces 688A): 题意: 有d天, n个人.如果这n个人同时出现, 那么你就赢不了他们所有的人, 除此之外, 你可以赢他们所有到场的人. 到场人数为0也算赢. 现 ...