萌新妹子求助
查看原帖
萌新妹子求助
18657
11223344w楼主2021/3/16 14:49
#include<bits/stdc++.h>
#define int long long
#define ll long long
using namespace std;
/*
ll ret; char ch; bool fh;
inline ll rd() {
	for(fh=0,ch=getchar();ch<'0'||ch>'9';ch=getchar()) {
		if(ch=='-') fh=1;
	}
	for(ret=0;ch>='0'&&ch<='9';ch=getchar()) {
		ret=(ret<<1)+(ret<<3)+ch-'0';
	}
	return fh?-ret:ret;
}
*/
const int N=3e5+5;
int n,m,cnt,dis[N],d[N],ls[N],rs[N],rt[N],ans[N],Ans[N],fro[N];
ll h[N],t1[N],t2[N],a[N],op[N];
vector<int>V[N];
struct A{ int id; ll x; }c[N];

inline int New(A x) {
	ls[++cnt]=rs[cnt]=d[cnt]=t1[cnt]=0,t2[cnt]=1,c[cnt]=x;
	return cnt;
}

inline void Tim(int p,ll x) {
	if(p) c[p].x*=x,t1[p]*=x,t2[p]*=x;
}
inline void Add(int p,ll x) {
	if(p) c[p].x+=x,t1[p]+=x; 
}
inline void down(int p) {
	if(t2[p]!=1) {
		Tim(ls[p],t2[p]),Tim(rs[p],t2[p]),t2[p]=1;
	}
	if(t1[p]!=0) {
		Add(ls[p],t1[p]),Add(rs[p],t1[p]),t1[p]=0;	
	}
}
int merge(int u,int v) {
	if(!u||!v) return u|v;
	down(u),down(v);
	if(c[u].x>c[v].x) swap(u,v);
	rs[u]=merge(rs[u],v);
	if(d[rs[u]]>d[ls[u]]) swap(ls[u],rs[u]);
	d[u]=d[rs[u]]+1;
	return u;
}

void dfs(int u) {
	for(auto v:V[u]) {
		dfs(v);
		rt[u]=merge(rt[u],rt[v]);
	}
	for(down(rt[u]);rt[u]&&c[rt[u]].x<h[u];rt[u]=merge(ls[rt[u]],rs[rt[u]]),down(rt[u])) {
		Ans[c[rt[u]].id]=dis[fro[c[rt[u]].id]]-dis[u];
		ans[u]++;
	}
	if(u!=1){
		if(op[u]) Tim(rt[u],a[u]);
			else Add(rt[u],a[u]);
	} else {
		for(;rt[u];rt[u]=merge(ls[rt[u]],rs[rt[u]])) {
			Ans[c[rt[u]].id]=dis[fro[c[rt[u]].id]];
		}
	}
}
queue<int>Q;
inline void bfs() {
	Q.push(1); dis[1]=1;
	while(!Q.empty()) {
		int u=Q.front(); Q.pop();
		for(auto v:V[u]) {
			dis[v]=dis[u]+1,Q.push(v);
		}
	}
}

signed main(){
	d[0]=-1;
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++) scanf("%lld",&h[i]);
	for(int i=2;i<=n;i++) {
		int u; scanf("%lld%lld%lld",&u,&op[i],&a[i]); 
		V[u].push_back(i);
	}
	for(int i=1;i<=m;i++) {
		ll u,v; scanf("%lld%lld",&u,&v);
		rt[v]=merge(rt[v],New((A){i,u}));
		fro[i]=v;
	}
	bfs();
	dfs(1);
	for(int i=1;i<=n;i++) printf("%lld\n",ans[i]);
	for(int i=1;i<=m;i++) printf("%lld\n",Ans[i]);
	return 0;
}

BZOJ数据全过了,但luogu的死活过不去

2021/3/16 14:49
加载中...