codevs p4633

原创 2016年06月01日 19:22:13

模板题

#include <bits/stdc++.h>
#define lc (o<<1)
#define rc (lc|1)
#define m ((l+r)>>1)
using namespace std;
const int MAXN = 100000 + 5;
int lazy[MAXN<<2],sum[MAXN<<2];
int dep[MAXN],fa[MAXN],siz[MAXN],son[MAXN],top[MAXN],pos[MAXN],sz=0,ec=0;
int to[MAXN<<1],next[MAXN<<1],fst[MAXN];
int n;
int in()
{
	int c=getchar(),x=0;
	while(!isdigit(c))c=getchar();
	while(isdigit(c)){x=x*10+c-'0';c=getchar();}
	return x;
}
inline void up(int o,int l,int r)
{
	sum[o]=0;
	if(l<r)sum[o]=sum[lc]+sum[rc];
	if(lazy[o])sum[o]+=lazy[o]*(r-l+1);
}
void update(int o,int l,int r,int cl,int cr,int cv)
{
	if(cl<=l && r<=cr)lazy[o]+=cv;
	else
	{
		if(cl<=m)update(lc,l,m,cl,cr,cv);
		if(m+1<=cr)update(rc,m+1,r,cl,cr,cv);
	}
	up(o,l,r);
}
int query(int o,int l,int r,int ql,int qr,int add)
{
	int ans=0;
	if(ql<=l && r<=qr)return sum[o]+add*(r-l+1);
	if(ql<=m)ans+=query(lc,l,m,ql,qr,add+lazy[o]);
	if(m+1<=qr)ans+=query(rc,m+1,r,ql,qr,add+lazy[o]);
	return ans;
}

void dfs1(int u,int f,int d)
{
	dep[u]=d;fa[u]=f;siz[u]=1;son[u]=0;
	for(int i=fst[u];i;i=next[i])
	{
		int v=to[i];
		if(v==f)continue;
		dfs1(v,u,d+1);
		siz[u]+=siz[v];
		if(siz[son[u]]<siz[v])son[u]=v;
	}
}
void dfs2(int u,int tp)
{
	top[u]=tp;pos[u]=++sz;
	if(son[u])dfs2(son[u],tp);
	for(int i=fst[u];i;i=next[i])
	{
		int v=to[i];
		if(v!=fa[u] && v!=son[u])
			dfs2(v,v);
	}
}
int add(int u,int v)
{
	to[++ec]=v;
	next[ec]=fst[u];
	fst[u]=ec;
}
int ask(int u,int v)
{
	int ans=0;
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		ans+=query(1,1,n,pos[top[u]],pos[u],0);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	ans+=query(1,1,n,pos[u],pos[v],0);
	return ans;
}
void modify(int u,int v)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]])swap(u,v);
		update(1,1,n,pos[top[u]],pos[u],1);
		u=fa[top[u]];
	}
	if(dep[u]>dep[v])swap(u,v);
	update(1,1,n,pos[u],pos[v],1);
}
int main()
{
	n=in();	
	for(int i=1;i<=n-1;i++)
	{
		int x=in(),y=in();
		add(x,y);
		add(y,x);
	}
	dfs1(1,0,1);
	dfs2(1,1);
	int q=in();
	for(int i=1;i<=q;i++)
	{
		int a=in(),b=in(),c=in();
		if(a==1)modify(b,c);
		else 
		{
			int ans=ask(b,c);
			printf("%d\n",ans);
		}
	}
	return 0;
}


版权声明:咩

相关文章推荐

【codevs】4633 树链剖分入门

之前的模板错了一个地方。。。调的时候怎么也不行。。。 更新&&求解都需要在树链上爬一边。。。 #include #include #define MAXN 249999 #defin...
  • otowa
  • otowa
  • 2016年02月28日 15:13
  • 183

codevs4633树链剖分练习题

#include #include #include #include #include #include #define ls (x

【vijos P1914】【codevs 3904】[NOIP2014 普及组T4]子矩阵(dfs+状压dp)

坠花湮,湮没一朝风涟

codevs P4645 修理草坪-DP优化-单调队列

在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在, 新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。 然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这...
  • Mys_C_K
  • Mys_C_K
  • 2017年01月18日 15:22
  • 206

Codevs P1652 淘汰赛制

Codevs P1652 淘汰赛制题目描述 Description淘汰赛制是一种极其残酷的比赛制度。2n名选手分别标号1,2,3,…2n-1,2n,他们将要参加n轮的激烈角逐。每一轮中,将所有参加该轮...

Codevs_P1082 线段树练习3(线段树)

题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和。输入描述 Input Description 第一行一个正整数n...

Codevs P1018 单词接龙

Codevs 1018 单词接龙题目描述 Description单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的“龙”(每个单...

Codevs_P1378 选课(树形DP+分组背包)

题目描述 Description 学校实行学分制。每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分。学校开设了N(N...

Codevs P3287 货车运输

Codevs P3287 货车运输题目描述 DescriptionA 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路。每一条道路对车辆都有重量限制,简称限重。现在有 q 辆货车在运输...

Codevs_P1080 线段树练习(线段树)

题目描述 Description 一行N个方格,开始每个格子里都有一个整数。现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和;修改的规则是指定某一个格子x,加上...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codevs p4633
举报原因:
原因补充:

(最多只允许输入30个字)