社区讨论

点分治疑似假了,求助

P3714[BJOI2017] 树的难题参与者 6已保存回复 6

讨论操作

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

当前回复
6 条
当前快照
1 份
快照标识符
@mmcuw3k2
此快照首次捕获于
2026/03/05 10:38
3 天前
此快照最后确认于
2026/03/05 11:01
3 天前
查看原帖
TLE 10 pts。
n=103n=10^3 洛谷用时 392392 ms。
n=104n=10^4 本机用时 62.5562.55 s。
明显不对劲,估计可能是假了,但是找不出假在哪,求助。
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5,M=2e5;
int n,m,L,R,a[N];
int ans=-1e9;
vector<pair<int,int>> e[N];
int del[N],sz[N],rt,tot;
vector<pair<int,int>> s;
struct sgt{
	#define mid ((le+ri)>>1)
	#define ls (u<<1)
	#define rs ((u<<1)|1)
	#define lp ls,le,mid
	#define rp rs,mid+1,ri
	struct nd{
		int s[2],c[2];
		nd(){
			memset(s,-0x3f,sizeof(s));
		}
		void upd(int ss,int cc){
			if(ss>s[0]){
				if(cc==c[0]){
					s[0]=ss;
				}
				else{
					s[1]=s[0];
					c[1]=c[0];
					s[0]=ss;
					c[0]=cc;
				}
			}
			else if(ss>s[1]){
				if(cc==c[0]){
					return;
				} 
				else{
					s[1]=ss;
					c[1]=cc;
				}
			}
		}
		void mer(nd t){
			for(int j=0;j<=1;j++){
				upd(t.s[j],t.c[j]);
			}
		}
	}r[N<<2];
	vector<int> op;
	void push_up(int u){
		r[u]=r[ls];
		r[u].mer(r[rs]);
	}
	void upd(int u,int le,int ri,int x,int s,int c){
		op.push_back(u);
		if(le==ri){
			r[u].upd(s,c);
			return;
		}
		if(x<=mid) upd(lp,x,s,c);
		else upd(rp,x,s,c);
		push_up(u);
	}
	int que(int u,int le,int ri,int x,int y,int c){
		if(x<=le&&ri<=y){
			int res=-1e9;
			for(int j=0;j<=1;j++){
				int ss=r[u].s[j];
				int cc=r[u].c[j];
				res=max(res,ss-(c==cc?a[c]:0));
			}
			return res;
		}
		int res=-1e9;
		if(x<=mid) res=max(res,que(lp,x,y,c));
		if(y>mid) res=max(res,que(rp,x,y,c));
		return res;
	}
	void cl(){
		for(int i:op){
			r[i]=nd{};
		}
	}
}t;
void dfs0(int u,int fa){
	sz[u]=1;
	for(auto [v,c]:e[u]){
		if(v==fa||del[v]) continue;
		dfs0(v,u);
		sz[u]+=sz[v];
	}
}
void dfs1(int u,int fa){
	for(auto [v,c]:e[u]){
		if(v==fa||del[v]) continue;
		if(sz[v]>tot/2){
			dfs1(v,u);
			return;
		}
	}
	rt=u;
}
void dfs2(int u,int fa,int lasc,int val,int len){
	s.push_back({val,len});
	if(L<=len&&len<=R) ans=max(ans,val);
	for(auto [v,c]:e[u]){
		if(v==fa||del[v]) continue;
		dfs2(v,u,c,val+(lasc==c?0:a[c]),len+1);
	}
}
void sol(int u){
	dfs0(u,0);
	tot=sz[u];
	dfs1(u,0);
	int r=rt;
	del[r]=1;
	for(auto [v,c]:e[r]){
		if(del[v]) continue;
		dfs2(v,r,c,a[c],1);
		for(auto [val,len]:s){
			if(R<=len) continue;
			ans=max(ans,val+t.que(1,1,M,max(L-len,1),R-len,c));
		}
		for(auto [val,len]:s){
			t.upd(1,1,M,len,val,c);
		}
		s.clear();
	}
	t.cl();
	for(auto [v,c]:e[r]){
		if(del[v]) continue;
		sol(v);
	}
}
signed main(){
//	freopen("journey2.in","r",stdin);
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m>>L>>R;
	for(int i=1;i<=m;i++){
		cin>>a[i];
	}
	for(int i=1;i<n;i++){
		int x,y,w;
		cin>>x>>y>>w;
		e[x].push_back({y,w});
		e[y].push_back({x,w});
	}
	sol(1);
	cout<<ans<<"\n";
}

回复

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

正在加载回复...