题解:P12027 [USACO25OPEN] Ski Slope S
本题是 USACO25OPEN 银组实现难度略大的题,由于这只属于银组知识范围,所以在此我当然不会用什么高级数据结构或算法,仅仅是一个朴素的的预处理即可。
根据题意,本题等效于给定一棵树和
接下来考虑具体代码实现。我们可以由终点倒推,维护到每个出发点的前
时间复杂度
代码:
#include<bits/stdc++.h>
using namespace std;
int n,p[100010],k;//一次性
long long e[100010],d[100010],_max[12][100010],ans[12][100010];
struct Node{
long long e,max_[12];
bool operator<(const Node& x)
{return max_[k]<x.max_[k];
}
}a[100010];
long long max_[12][100010];
int main()
{cin>>n;
for(int i=2;i<=n;i++)
{cin>>p[i]>>d[i]>>e[i];
e[i]+=e[p[i]];
a[i].e=e[i];
for(int j=1;j<=11;j++)
_max[j][i]=_max[j][p[i]];
for(int j=1;j<=11;j++)
{if(d[i]>_max[j][i])
swap(d[i],_max[j][i]);
a[i].max_[j]=_max[j][i];
}
}
for(k=1;k<=11;k++)
{sort(a+1,a+1+n);
for(int i=2;i<=n;i++)
{ans[k][i]=max(ans[k][i-1],a[i].e);
max_[k][i]=a[i].max_[k];
}
}
int m;cin>>m;
while(m--)
{int s,c;
cin>>s>>c;
c++;
int id=upper_bound(max_[c]+1,max_[c]+n+1,s)-max_[c]-1;
cout<<ans[c][id]<<'\n';
}
}