社区讨论

悬棺求调,20pts,Ac on #3#4

P3261[JLOI2015] 城池攻占参与者 2已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mhjucgel
此快照首次捕获于
2025/11/04 08:38
4 个月前
此快照最后确认于
2025/11/04 08:38
4 个月前
查看原帖
马蜂清奇,见谅
CPP
#include<bits/stdc++.h>
using namespace std;
#define ll __int128 
int n,m,dep[300005],bz[300005],ans1[300005],ans2[300005];
vector<int> mp[300005];
struct node{
	int f,rt;
	ll h,a,v;
}p[300005];
struct node2{
	int ls,rs,fa,dis,id;
	ll val,lz1,lz2;
}q[300005];
void pd(int x){
	q[q[x].ls].lz1*=q[x].lz2,q[q[x].ls].lz2*=q[x].lz2,q[q[x].ls].lz1+=q[x].lz1,q[q[x].ls].val*=q[x].lz2,q[q[x].ls].val+=q[x].lz1;
	q[q[x].rs].lz1*=q[x].lz2,q[q[x].rs].lz2*=q[x].lz2,q[q[x].rs].lz1+=q[x].lz1,q[q[x].rs].val*=q[x].lz2,q[q[x].rs].val+=q[x].lz1;
	q[x].lz1=0,q[x].lz2=1;
}
int merge(int x,int y){
	pd(x),pd(y);
	if(!x||!y||x==y) return x|y;
	if(q[x].val<=q[y].val) q[x].rs=merge(q[x].rs,y);
	else swap(x,y),q[x].rs=merge(q[x].rs,y);
	if(q[q[x].ls].dis<q[q[x].rs].dis) swap(q[x].ls,q[x].rs);
	q[x].dis=q[q[x].rs].dis+1;
	return x;
}
int find(int x){
	if(q[x].fa==x) return x;
	else return q[x].fa=find(q[x].fa);
}
void dfs(int u){
	dep[u]=dep[p[u].f]+1;
	int len=mp[u].size();
	for(int i=0;i<len;i++){
		dfs(mp[u][i]);
		int x=find(p[u].rt),y=find(p[mp[u][i]].rt);
		q[x].fa=q[y].fa=merge(x,y);
		p[u].rt=q[x].fa;
	}
	while(p[u].rt!=0&&bz[find(p[u].rt)]==0&&q[find(p[u].rt)].val<p[u].h){
		int x=find(p[u].rt);
		pd(x),ans1[u]++,ans2[x]=dep[u];
		bz[x]=1,q[x].fa=q[q[x].ls].fa=q[q[x].rs].fa=merge(q[x].ls,q[x].rs);
		p[u].rt=q[x].fa,q[x].ls=q[x].rs=0;
		pd(q[x].fa);
	}
	int x=find(p[u].rt);
	if(p[u].a==0) pd(x),q[x].lz1+=p[u].v,q[x].val+=p[u].v;
	else pd(x),q[x].lz2*=p[u].v,q[x].val*=p[u].v;
	pd(x); 
}
signed main(){
	q[0].dis=-1;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		long long x;
		scanf("%lld",&x);
		p[i].h=x;
	}
	for(int i=2;i<=n;i++){
		long long x,y;
		scanf("%d%lld%lld",&p[i].f,&x,&y);
		p[i].a=x,p[i].v=y;
		mp[p[i].f].push_back(i);
	}
	for(int i=1;i<=m;i++){
		long long s;
		int c;
		scanf("%lld%d",&s,&c);
		q[i].fa=i,q[i].lz2=1,q[i].val=s,q[i].id=c;
		int x=find(p[c].rt),y=i;
		q[x].fa=q[y].fa=merge(p[c].rt,i);
		p[c].rt=find(q[y].fa);
		q[0].fa=0;
	}
	dfs(1);
	for(int i=1;i<=n;i++) printf("%lld\n",ans1[i]);
	for(int i=1;i<=m;i++) printf("%lld\n",dep[q[i].id]-ans2[i]);
}

回复

1 条回复,欢迎继续交流。

正在加载回复...