树剖re求助

#include<map>
#include<cstring>
#include<vector>
#include<cstdio>
using namespace std;
int n,m,r,p,a[800101],vis[800101],father[800101],w[800101],d[800101],top[800101],c[800101],cnt1[800101],cnt2,ctop,tree[800001],lazy[800001],flag,x,y,z;
vector<int>g[800101];
map<int,map<int,int> >vis2;
bool check(int x,int y){
	for(int i=0;i<g[x].size();i++){
		if(!vis2[x][i]&&!vis[g[x][i]]&&w[g[x][i]]>w[g[x][y]])return false;
	}
	return true;
}
void lazytag(int o,int l,int r,int k){lazy[o]+=k;tree[o]=((long long)tree[o]+(long long)(r-l+1)*k)%p;}
void pushup(int o){tree[o]=((long long)tree[o<<1]+tree[o<<1|1])%p;}
void pushdown(int o,int l,int r){
	if(!lazy[o])return;
	lazy[o<<1]=((long long)lazy[o<<1]+lazy[o])%p;
	lazy[o<<1|1]=((long long)lazy[o<<1|1]+lazy[o])%p;
	int mid=(l+r)>>1;
	tree[o<<1]=((long long)tree[o<<1]+(long long)lazy[o]*(mid-l+1))%p;
	tree[o<<1|1]=((long long)tree[o<<1|1]+(long long)lazy[o]*(r-mid))%p;
	lazy[o]=0;
}
void build(int o,int l,int r){
	if(l==r){
		tree[o]=a[c[l]];return;
	}
	int mid=(l+r)>>1;
	build(o<<1,l,mid);
	build(o<<1|1,mid+1,r);
	pushup(o);
}
void add(int o,int l,int r,int ql,int qr,int k){
	if(ql<=l&&r<=qr){lazytag(o,l,r,k);return;}
	int mid=(l+r)>>1;
	pushdown(o,l,r);
	if(mid>=ql)add(o<<1,l,mid,ql,qr,k);
	if(mid<qr)add(o<<1|1,mid+1,r,ql,qr,k);
	pushup(o);
}
int sum(int o,int l,int r,int ql,int qr){
	if(ql<=l&r<=qr)return tree[o];
	int ans=0;int mid=(l+r)>>1;
	pushdown(o,l,r);
	if(mid>=ql)ans=((long long)ans+sum(o<<1,l,mid,ql,qr))%p;
	if(mid<qr)ans=((long long)ans+sum(o<<1|1,mid+1,r,ql,qr))%p;
	return ans;
}
void dfs1(int x){
	w[x]=1;
	for(int i=0;i<g[x].size();i++){
		if(!vis[g[x][i]]&&father[x]!=g[x][i]){
		vis[g[x][i]]=1;father[g[x][i]]=x;d[g[x][i]]=d[x]+1;
	    dfs1(g[x][i]);w[x]+=w[g[x][i]];
		}
	}
}
void dfs2(int x,int v){
	vis[x]=1;cnt1[x]=++cnt2;c[++ctop]=x;
	for(int i=0;i<g[x].size();i++){
		if(father[x]!=g[x][i]&&!vis[g[x][i]]&&!vis2[x][i]&&check(x,i)){
			if(!v)top[g[x][i]]=top[x];
			vis2[x][i]=1;dfs2(g[x][i],v);v=1;
		}
	}
}
void shupou(int x,int y,int z){
	while(top[x]!=top[y]){
		if(d[top[x]]<d[top[y]])swap(x,y);
		add(1,1,n,cnt1[top[x]],cnt1[x],z);
		x=father[top[x]];
	}
	if(d[x]<d[y])swap(x,y);
	add(1,1,n,cnt1[y],cnt1[x],z);
}
int shupou1(int x,int y){
	int ans=0;
	while(top[x]!=top[y]){
		if(d[top[x]]<d[top[y]])swap(x,y);
		ans=((long long)ans+sum(1,1,n,cnt1[top[x]],cnt1[x]))%p;
		x=father[top[x]];
	}
	if(d[x]<d[y])swap(x,y);
	ans=((long long)ans+sum(1,1,n,cnt1[y],cnt1[x]))%p;
	return ans;
}
int main(){
	scanf("%lld%lld%lld%lld",&n,&m,&r,&p);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]),father[i]=top[i]=i;
	for(int i=1;i<=n-1;i++){
		scanf("%lld%lld",&x,&y);
		g[x].push_back(y);
		g[y].push_back(x);
	}
	d[r]=1;
	dfs1(r);memset(vis,0,sizeof(vis));dfs2(r,0);
	build(1,1,ctop);
	while(m--){
		scanf("%lld",&flag);
		if(flag==1)scanf("%lld%lld%lld",&x,&y,&z),shupou(x,y,z);
		if(flag==2)scanf("%lld%lld",&x,&y),printf("%d\n",shupou1(x,y));
		if(flag==3)scanf("%lld%lld",&x,&z),add(1,1,n,cnt1[x],cnt1[x]+w[x]-1,z);
		if(flag==4)scanf("%lld",&x),printf("%d\n",sum(1,1,n,cnt1[x],cnt1[x]+w[x]-1));
	}
	return 0;
}

#C++工程师#
全部评论

相关推荐

感觉这一周太梦幻了,就像一个梦,很不真实~~~感觉这个暑期,我的运气占了99成,实力只有百分之一4.15上午&nbsp;腾讯csig&nbsp;腾讯云部门,面完秒进入复试状态4.16下午&nbsp;美团优选供应链部门,4.18上午发二面4.17晚上&nbsp;阿里国际一面,纯拷打,面完我都玉玉了4.18下午&nbsp;阿里国际二面,是我们leader面的我,很轻松~~4.18晚上&nbsp;约了hr面4.19上午&nbsp;hr面,下午两点口头oc4.19晚上&nbsp;意向书说起来我的暑期好像一次都没挂过~~~~~难道我是天生面试圣体?----------------------------------------------------------------------六个月前,我还是0项目0刷题,当时想的是先把论文发出来再去找实习。结果一次组会,老师打破了我的幻想(不让投B会,只让投刊或者A)我拿头投啊!!!然后就开始物色着找实习,顺便做完了mit的6.s081,但是基本上还是没刷过题目-----------------------------------------------------------------------11月&nbsp;&nbsp;一次偶然的机会,面进了某个耳机厂的手环部门,大概是做嵌入式的,用的是CPP。12月&nbsp;莫名其妙拿到了国创的面试机会,0基础四天速成java基础!居然也给我面过了hhhhh,可能是面试没写题吧入职国创后的几个月,一直没活,天天搁那看剧,都快忘了还有暑期实习这回事了~~~~命运的齿轮在2.26开始转动,因为这一天美团开了,我开始慌了,因为那时的我什么都不会。lc,八股,sql全部是0进度。然后就开始了女娲补天,上班刷题,下班继续做之前的开源,顺便学一学八股。3月到现在,lc也刷到快200了,一天最多提交了47次~~~~~~~~~~八股根据别人的面经总结和博客,写了快十万字的笔记~~~~~~~~~~简历上的实习经历和开源,也努力去深挖了,写了几万字的记录~~~~~~所以面试的时候,基本上都能cover了,面试官问到的基础基本都会,不基础的我就把他往我会的地方引。结果好像还不错,基本上每个面试官评价都挺好的emmmmmmmm
投递阿里巴巴等公司10个岗位
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务