题面不清晰.
能量恰好衰减到0能否收到?
感觉程序的锅应该是只能出在这里了.
目前70pts,wa了3个点.
#include <bits/stdc++.h>
int read(){
int x=0;char c;
do{c=getchar();}while(!isdigit(c));
do{x=x*10+c-'0';c=getchar();}while(isdigit(c));
return x;
}
const int N=20000+10;
struct E{ int v,w; E(int a,int b):v(a),w(b){} };
std::vector<E> g[N];
int n,S0,fa[N],dep[N],pre[N],len[N],L[N],R[N],idx;
struct T{ int from,to; T(int a,int b):from(a),to(b){} };
// there should be one expand, in [from,to]
int bit[N];
inline int lowbit(int x){ return x&(-x); }
void add(int x,int y){ while(x<=n){ bit[x]+=y; x+=lowbit(x); } }
int qry(int x){ int y=0; while(x){ y+=bit[x]; x^=lowbit(x); } return y; }
inline void put(int x){ add(L[x],1);add(R[x]+1,-1); }
inline int get(int x){ return qry(L[x]); }
std::vector<T> vec;
void dfs(int u,int f){
L[u]=++idx; dep[u]=dep[fa[u]=f]+1; pre[dep[u]]=u;
// THE LINE BELOW
if(len[u]>=S0){
int l=2,r=dep[u]-1,mid=0,ans=-1;
while(l<=r){
mid=(l+r)>>1;
// THE LINE BELOW
if(len[u]-len[pre[mid]]<S0){
ans=mid; r=mid-1;
}else l=mid+1;
}
vec.push_back(T{u,pre[ans]});
}
for(const auto e:g[u]) if(dep[e.v]==0){
len[e.v]=len[u]+e.w;
dfs(e.v,u);
}
R[u]=idx; pre[dep[u]]=0;
}
int main(){
n=read();int maxval=0;
for(int i=1;i<=n;i++){
int k=read();
for(int j=0;j<k;j++){
int v=read(),w=read();
g[i].push_back(E{v,w});
maxval=std::max(maxval,w);
}
}
S0=read();
if(maxval>=S0){ puts("No solution."); return 0; }
dfs(1,0);
std::sort(vec.begin(),vec.end(),[](auto a,auto b){
return dep[a.to]>dep[b.to];
});
int ans=0; for(auto v:vec){
if(get(v.from)-get(fa[v.to])>0) continue;
ans++; put(v.to);
}
std::cout<<ans<<std::endl;
return 0;
}