Description

给定一棵结点数为n的树,初始点权均为0,有依次q个操作,每次操作有三个参数a,b,c,当a=1时,表示给b号结点到c号结点路径上的所有点(包括b,c,下同)权值都增加1,当a=2时,表示询问b号结点到c号结点路径上的所有点权值之和。

Input

第一行,一个正整数n。

接下来n-1行,每行一对正整数x,y,表示x号结点和y号结点之间有一条边。

第n+1行,一个正整数q。

最后q行,每行一组正整数a,b,c,表示操作的三个参数。b和c可能相等。

保证数据都是合法的。

Output

若干行,每行一个非负整数表示答案。

Sample Input

5

1 2

2 3

1 4

2 5

5

1 4 5

2 1 5

1 1 3

2 5 3

2 4 3

Sample Output

3

4

6

题解:

如题名,数剖练习题。

代码:

 var
son,siz,dep,top,w,fa,tt2,c,flag:array[-..]of longint;
tt:array[-..,-..]of longint;
b:array[-..,..]of longint;
i,j,k,l,n,m,totw,q,t:longint;
function cc2(x,l,r:longint):longint;
begin
cc2:=; cc2:=cc2+(r-l+)*tt[x,];
if tt[x,]=tt[x,] then exit;
if r<=(tt[x,]+tt[x,])div then cc2:=cc2+cc2(tt[x,-],l,r)else
if l>(tt[x,]+tt[x,])div then cc2:=cc2+cc2(tt[x,-],l,r)else
begin cc2:=cc2+cc2(tt[x,-],l,(tt[x,]+tt[x,])div );
cc2:=cc2+cc2(tt[x,-],((tt[x,]+tt[x,])div )+,r); end;
end;
procedure cc1(x,l,r:longint);
begin
if(l=tt[x,])and(r=tt[x,])then
begin tt[x,]:=tt[x,]+; exit; end;
if r<=(tt[x,]+tt[x,])div then cc1(tt[x,-],l,r)else
if l>(tt[x,]+tt[x,])div then cc1(tt[x,-],l,r)else
begin cc1(tt[x,-],l,(tt[x,]+tt[x,])div );
cc1(tt[x,-],((tt[x,]+tt[x,])div )+,r); end;
end;
procedure ss(z,x,y:longint);
var i,j,k,l,f1,f2,tot:longint;
begin
f1:=top[x]; f2:=top[y]; tot:=;
while f1<>f2 do
begin
if dep[f1]<dep[f2] then
begin j:=f1; f1:=f2; f2:=j; j:=x; x:=y; y:=j; end;
if z= then cc1(,w[f1],w[x])else
tot:=tot+cc2(,w[f1],w[x]); x:=fa[f1]; f1:=top[x];
end;
if w[x]>w[y] then begin j:=x; x:=y; y:=j; end;
if z= then cc1(,w[x],w[y])else
begin tot:=tot+cc2(,w[x],w[y]); writeln(tot); end;
end;
procedure dfs2(x:longint);
var i,j,k,l:longint;
begin
j:=c[x];
while b[j,]=x do
begin
if b[j,]=son[x] then
begin
flag[b[j,]]:=; top[b[j,]]:=top[x];
inc(totw); w[b[j,]]:=totw; tt2[totw]:=b[j,];
dfs2(b[j,]);
end;
inc(j);
end;
j:=c[x];
while b[j,]=x do
begin
if flag[b[j,]]= then
begin
flag[b[j,]]:=; top[b[j,]]:=b[j,];
inc(totw); w[b[j,]]:=totw; tt2[totw]:=b[j,];
dfs2(b[j,]);
end;
inc(j);
end;
end;
procedure dfs1(x:longint);
var i,j,k,l:longint;
begin
j:=c[x]; siz[x]:=;
while b[j,]=x do
begin
if fa[b[j,]]= then
begin
fa[b[j,]]:=x;
dep[b[j,]]:=dep[x]+;
dfs1(b[j,]); siz[x]:=siz[x]+siz[b[j,]];
if(son[x]=)or(siz[son[x]]<siz[b[j,]])then
son[x]:=b[j,];
end;
inc(j);
end;
end;
procedure sort(l,r:longint);
var
i,j,x,x2:longint;
y:array[..]of longint;
begin
i:=l; j:=r;
x:=b[(l+r)div ,];
x2:=b[(l+r)div ,];
repeat
while(b[i,]<x)or((b[i,]=x)and(b[i,]<x2))do inc(i);
while(x<b[j,])or((b[j,]=x)and(b[j,]>x2))do dec(j);
if not(i>j) then
begin
y:=b[i];
b[i]:=b[j];
b[j]:=y;
inc(i);
j:=j-;
end;
until i>j;
if l<j then sort(l,j);
if i<r then sort(i,r);
end;
procedure make(l,r:longint);
var i,j,k:longint;
begin
inc(t); i:=t; tt[i,]:=l; tt[i,]:=r;
if l<>r then
begin
tt[i,-]:=t+; make(l,(l+r)div );
tt[i,-]:=t+; make(((l+r)div )+,r);
end;
end;
begin
readln(n); m:=(n-)*;
for i:= to n- do
begin
readln(b[i*-,],b[i*-,]);
b[i*,]:=b[i*-,]; b[i*,]:=b[i*-,];
end;
sort(,m); j:=;
for i:= to n do
begin
if j>m then break;
if b[j,]>i then continue;
c[i]:=j; while b[j,]=i do inc(j);
end;
dep[]:=; fa[]:=-; dfs1();
totw:=; top[]:=; tt2[]:=; w[]:=; flag[]:=; dfs2();
t:=; make(,n);
readln(q);
for i:= to q do
begin
readln(j,k,l);
ss(j,k,l);
end;
end.

CODE[VS]4633Mz树链剖分练习的更多相关文章

  1. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  2. 【BZOJ-3553】三叉神经树 树链剖分

    3553: [Shoi2014]三叉神经树 Time Limit: 160 Sec  Memory Limit: 256 MBSubmit: 347  Solved: 112[Submit][Stat ...

  3. 【BZOJ-2836】魔法树 树链剖分

    2836: 魔法树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 323  Solved: 129[Submit][Status][Discuss] ...

  4. 【BZOJ-4353】Play with tree 树链剖分

    4353: Play with tree Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 31  Solved: 19[Submit][Status][ ...

  5. 【BZOJ-4568】幸运数字 树链剖分 + 线性基合并

    4568: [Scoi2016]幸运数字 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 238  Solved: 113[Submit][Status ...

  6. 【BZOJ-4127】Abs 树链剖分 + 线段树 (有趣的姿势)

    4127: Abs Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 381  Solved: 132[Submit][Status][Discuss] ...

  7. 【BZOJ-4515】游戏 李超线段树 + 树链剖分 + 半平面交

    4515: [Sdoi2016]游戏 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 304  Solved: 129[Submit][Status][ ...

  8. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

  9. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

随机推荐

  1. jQuery:实现两个<select>控件的互移操作

    一.直接上代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> < ...

  2. clipChildren和clipToPadding

    clipChildren 和 clipToPadding clipChild 用于定义子控件是否在父控件边界内进行绘制.clipChild 默认为 true.也就是不允许进行扩展绘制. clipToP ...

  3. h5应用缓存及收藏时Icon显示

    h5应用实现离线缓存,加载后,断网仍然可以继续使用. 一.需求 转行做h5,目前做赛道游戏,动手做了个赛道编辑器web版的,由于web版需要开启服务器才能使用,策划要想回家使用就要发布到外网服务器了, ...

  4. golang枚举类型 - iota用法拾遗

    在c#.java等高级语言中,经常会用到枚举类型来表示状态等.在golang中并没有枚举类型,如何实现枚举呢?首先从枚举的概念入手. 1.枚举类型定义 从百度百科查询解释如下:http://baike ...

  5. enumerate用法总结-Python 3

    enumerate()说明 enumerate()是python的内置函数 enumerate在字典上是枚举.列举的意思 对于一个可迭代的(iterable)/可遍历的对象(如列表.字符串),enum ...

  6. Centos下搭建 tomcat https服务器详解(原创)

    一 .安装java jdk配置环境变量 1. 卸载原有openjdk yum -y remove java-1.7.0-openjdk* yum -y remove tzdata-java.noarc ...

  7. JS 传播事件、取消事件默认行为、阻止事件传播

    1.事件处理程序的返回值 通常情况下,返回值false就是告诉浏览器不要执行这个事件相关的默认操作.例如,表单提交按钮的onclick事件处理程序能通过返回false阻止浏览器提交表单,再如a标签的o ...

  8. 浅析天猫H5站点

    前言 我们做前端开发的时候,很有可能会做一个竞品分析,比如我就做过去哪儿.艺龙.同程等与携程的移动站点竞品分析,竞品分析的目的一般是技术对比,但是更多的是业务对比,知己知彼,百战不殆:我们同时会借鉴. ...

  9. 用gcc进行程序的编译

    在Linux系统上,一个档案能不能被执行看的是有没有可执行的那个权限(x),不过,Linux系统上真正认识的可执行文件其实是二进制文件(binary program),例如/usr/bin/passw ...

  10. activemq和jms是种什么关系

    JMS是一个用于提供消息服务的技术规范,它制定了在整个消息服务提供过程中的所有数据结构和交互流程. 而activemq则是消息队列服务,是面向消息中间件(MOM)的最终实现,是真正的服务提供者. jm ...