nlogn的算法为啥会tle,求解
查看原帖
nlogn的算法为啥会tle,求解
1122530
elpsconr楼主2024/8/3 01:33

树的深度是logn的,遍历n遍,所以时间复杂度是O(nlong)的,二分也是O(nlogn)两个加起来还是O(nlogn)的时间复杂度,为啥会tle?

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define PII pair<int,int>
#define cy cout<<"YES"<<endl
#define cn cout<<"NO"<<endl
#define l(rt) rt<<1
#define r(rt) rt<<1|1
const int N=3e5+6,yyx=4e9+7;
int n,k,pre[N],a[N],c[N],p[N],d[N];
vector<int> to[N];
void dfs(int now,int fa){
    pre[now]=pre[fa]+a[now];
    d[now]=d[fa]+1;
    for(auto v:to[now]){
        if(v==now) continue;
        dfs(v,now);
    }
}
int bruteforce(int x){
   int ans=0,cnt=0,z=x;
   while(ans<=c[z]&&x) ans+=a[x],x=p[x],cnt++;
   if(ans>c[z]) return cnt-1;
   return cnt;
}
bool check(int x){

}
void solve(){
  cin>>n;
  for(int i=2;i<=n;++i){
    cin>>p[i];
    to[p[i]].push_back(i);
  } 
  for(int i=1;i<=n;++i) cin>>a[i];
  for(int i=1;i<=n;++i) cin>>c[i];
  dfs(1,0);
  vector<int> mp;
  for(int i=1;i<=n;++i){
    int x=i;
    //mp[i].push_back(0);
    mp.clear(),mp.push_back(0);
    while(x){
       mp.push_back(pre[i]-pre[p[x]]);x=p[x];
    } 
    int l=0,r=d[i]+1;
    while(l+1<r){
        int m=l+r>>1;
        if(mp[m]<=c[i]) l=m;
        else r=m;
    }
    cout<<l<<" ";
  }
//   for(int i=1;i<=n;++i){
//     for(int j=1;j<mp[i].size();++j) cout<<mp[i][j]<<" ";
//     puts("");
//   } 
  //for(int i=1;i<=n;++i) cout<<rep[i]<<endl;
}
signed main(){
    cin.tie(0)->sync_with_stdio(0);
    int _=1;
    //cin>>_;
    while(_--)
    solve();
    return 0;
}
2024/8/3 01:33
加载中...