【第22期】观点:IT 行业加班,到底有没有价值?

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 p4633

模板题

[练习]: 树链剖分练习题

这些是一些树剖的基础题 难度从低到高 初学者一定要做一做。。 1.洛谷p3384树链剖分模板 //一定记得任何算值的地方取模。。还有注意add和query时候深度小的在前面!不然线段树会卡死 #...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

CODEVS 4633 [Mz]树链剖分练习

题目描述 Description 给定一棵结点数为n的树,初始点权均为0,有依次q个操作,每次操作有三个参数a,b,c,当a=1时,表示给b号结点到c号结点路径上的所有点(包括b,c,下同)权值都增...

Codevs_P1066 引水入城(BFS+贪心)

题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度。 ...

codevs4633树链剖分练习题

#include #include #include #include #include #include #define ls (x<<1) #define rs (x<<1|1) #define ...

Codevs P1653 种树 2

1653 种树 2题目描述 Description一条街的一边有几座房子。因为环保原因居民想要在路边种些树。路边的地区被分割成块,并被编号为1…n。每个块的大小为一个单位尺寸并最多可种一裸树。每个居民...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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