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 1069关押罪犯 并查集

1069 关押罪犯   2010年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond ...
  • u013653310
  • u013653310
  • 2015年07月07日 17:46
  • 2127

【NOIP2000】乘积最大

1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Des...
  • Loi_Shirley
  • Loi_Shirley
  • 2016年09月26日 23:28
  • 1736

点分治专题——bzoj 1468 &bzoj 2152 题解

【前言】最近一直在忙着学算法,但是效果似乎不是很好。前段时间的树剖也快忘了= =。树套树没熟练,就开始写主席树了= =。更别说本身就不是很懂的莫比乌斯反演了。~~决定好好复习一下。 【点分治的作用】套...
  • u013724185
  • u013724185
  • 2014年05月13日 20:50
  • 3203

codevs4633树链剖分练习题

#include #include #include #include #include #include #define ls (x
  • zgx_2000
  • zgx_2000
  • 2017年02月07日 14:39
  • 202

【codevs】4633 树链剖分入门

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

codevs P1421 秋静叶&秋穣子

题目大意: 在幻想乡,秋姐妹决定比比谁能够收集到最多的红叶。静叶将红叶分成了N堆(编号1..N),并且规定了它们的选取顺序,刚好形成一颗有向树。在游戏过程中,两人从根节点开始,轮流取走红叶,当一个人...
  • Gx_Man_VIP
  • Gx_Man_VIP
  • 2018年01月16日 17:06
  • 11

Codevs_P3377 [Mz]接水问题2(STL+优先队列)

时间限制: 1 s 空间限制: 64000 KB 题目等级 : 钻石 Diamond 题目描述 Description 学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟...
  • qq_18455665
  • qq_18455665
  • 2015年12月13日 15:00
  • 368

【codevs 1041】【vijos P1119】[NOIP提高组2001] Car的旅行路线(最短路)

月坠星河湾,草碧舞幽梦,寂夜水无澜
  • reverie_mjp
  • reverie_mjp
  • 2016年11月10日 17:35
  • 2876

Codevs P1155 金明的预算方案

Codevs P1155 金明的预算方案题目描述 Description金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间。更让他高兴的是,妈妈昨天对他说:“你的房间需...
  • xuxianbo123
  • xuxianbo123
  • 2015年10月25日 10:24
  • 246

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

在一年前赢得了小镇的最佳草坪比赛后,FJ变得很懒,再也没有修剪过草坪。现在, 新一轮的最佳草坪比赛又开始了,FJ希望能够再次夺冠。 然而,FJ的草坪非常脏乱,因此,FJ只能够让他的奶牛来完成这...
  • Mys_C_K
  • Mys_C_K
  • 2017年01月18日 15:22
  • 253
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codevs p4633
举报原因:
原因补充:

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