社区讨论
点分治疑似假了,求助
P3714[BJOI2017] 树的难题参与者 6已保存回复 6
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 6 条
- 当前快照
- 1 份
- 快照标识符
- @mmcuw3k2
- 此快照首次捕获于
- 2026/03/05 10:38 3 天前
- 此快照最后确认于
- 2026/03/05 11:01 3 天前
TLE 10 pts。
洛谷用时 ms。
本机用时 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 条回复,欢迎继续交流。
正在加载回复...