bzoj1103
其实这道题和以前在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的更多相关文章
- BZOJ1103 [POI2007]大都市meg dfs序 线段树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1103 题意概括 一棵树上,一开始所有的边权值为1,我们要支持两种操作: 1. 修改某一条边的权值为 ...
- 【BZOJ1103】大都市meg(DFS序,树状数组)
题意:有一颗树,1号点为根,保证编号小的点深度较小,初始状态每条边都没有被标记,要求实现两个操作在线: A:将连接x,y的边标记 W:查询从1到x的路径上有多少条边未被标记 n<=2*10^5 ...
- [bzoj1103][POI2007]大都市meg_dfs序_树状数组
大都市meg bzoj-1103 POI-2007 题目大意:给定一颗n个点的树,m次操作.将一条路的边权更改成0:查询一个点到根节点的点权和.开始的时候所有边的边权都是1. 注释:$1\le n,m ...
- bzoj1103树状数组水题
(卧槽,居然规定了修改的两点直接相连,亏我想半天) 非常水的题,用dfs序(而且不用重复,应该是直接规模为n的dfs序)+树状数组可以轻松水 收获:树状数组一遍A(没啥好骄傲的,那么简单的东西) #i ...
- 【BZOJ-1103】大都市meg 树状数组 + DFS序
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2009 Solved: 1056[Submit][Sta ...
- bzoj1103: [POI2007]大都市meg
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1103 题目大意:在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Ma ...
- BZOJ1103[POI2007]大都市meg 题解
题目大意: 有一棵树,最先每条边的权值是1,然后给出n+m-1个操作,操作有两种:1.询问一个点到根的路径上的权值和:2.将一条边的权值改为0. 思路: 用dfs序将树化为序列,在dfs序中我们会保存 ...
- [bzoj1103][POI2007]大都市meg(树状数组+dfs序)
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2031 Solved: 1069[Submit][Sta ...
- BZOJ1103 [POI2007]大都市meg(DFS序)
题目:一颗树,单边修改,链上查询..实际上链是根到结点的链.网上好像有其他做法,我的想法是这样的: 先不看修改,毫无疑问查询只是查询结点的深度:而修改一条边会有什么影响:影响是且只是以边上深度最深结点 ...
随机推荐
- KMP入门(周期)
Description Given two strings a and b we define a*b to be their concatenation. For example, if a = & ...
- PHP连接sqlserver的两种方法,向sqlserver2000中写入数据,中文乱码
项目环境是php5.3.28 项目用的ThinkPHP3.2.3 已经mysql5.5数据库,要和另一个项目对接,需要连接sqlsever2000数据库进行一些操作. 第一种用php自带扩展连接数据 ...
- 进程,线程(thread)
每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段, 它可以在程序里独立执行.也可把它理解为代码运行 ...
- entity framework mysql 那些写法你碰不得
记 几次 ef 数据查询踩到的坑......未完待续
- JSON对象的stringify()和parse()方法
1.stringify() ---- JavaScript对象序列化为JSON字符串 eg1. var book = {title: 'JS', authors: ['Van'], edition:3 ...
- 懒加载 lazy load
懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据, 而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用. 比 ...
- WCF学习笔记(基于REST规则方式)
一.WCF的定义 WCF是.NET 3.0后开始引入的新技术,意为基于windows平台的通讯服务. 首先在学习WCF之前,我们也知道他其实是加强版的一个面向服务(SOA)的框架技术. 如果熟悉Web ...
- linux下tomcat的安装
本文主要内容: (1)安装apr,这是 Apache 为了提升 Tomcat 的性能搞的一套本地化 Socket, Thread, IO 组件也就是说它有高级 IO 功能, 操作系统级别的功能调用, ...
- 微调Win8.1这台电脑
从前有个笑话:一位朋友在办公室受到领导教育:“我说小王同志啊,虽然这电脑是你打了报告组织上买给你用的,可是你也不好这么狂妄嘛...”可怜的他只好把图标的名字改为“大家的电脑”. 想必大家已经知道这个笑 ...
- 不能将“const char [7]”转换为“LPCTSTR”
試試用強制轉換變數型態的方法吧,像這樣(LPCTSTR)"WinSun",若不行再試L"WinSun",再不行試_L"WinSun".