悬关:萌新求调CSP-S T4 TLE
  • 板块学术版
  • 楼主dk_qwq
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/10/24 20:56
  • 上次更新2023/11/2 11:32:16
查看原帖
悬关:萌新求调CSP-S T4 TLE
311306
dk_qwq楼主2023/10/24 20:56

将39行改成40行就T掉了,但是不管return什么都是log的吧

#include<iostream>
#include<cstdio>
#include<vector>
#define pb push_back
#include<algorithm>
using namespace std;
namespace INPUT{
    char buf[1<<20],*p1,*p2;
    #define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template<typename T>
T read(){
    T x=0,p=1;
    char ch=gc();
    for(;ch<'0'||ch>'9';ch=gc())
        if(ch=='-') p=-1;
    for(;'0'<=ch&&ch<='9';ch=gc())
        x=(x<<3)+(x<<1)+(ch^48);
    return x*p;
}
#define ll long long
#define INF (ll)(1e9+105)
const int N=1e5+5;
vector<int>G[N];
void add(int u,int v){G[u].pb(v),G[v].pb(u);}
int fa[N];
void dfs0(int u,int f){
    for(auto v:G[u]) v!=f?(dfs0(v,u),fa[v]=u):(false);
}

int n;
ll a[N],b[N],c[N],z[N];
bool checkA(ll l,ll r,int i){
    if(l>=z[i]) return r-l+1>=a[i];
    ll res=0;
    if(r>=z[i]) res+=r-z[i]+1,r=z[i]-1;
    if(res>=a[i]) return true;
    max(b[i]+l*c[i],1ll)+max(b[i]+r*c[i],1ll)>(((a[i]-res)<<1)-1)/(r-l+1);
    // return max(b[i]+l*c[i],1ll)+max(b[i]+r*c[i],1ll)>(((a[i]-res)<<1)-1)/(r-l+1);
}
ll calc(int i,ll D){
    ll l=0,r=D,mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(checkA(mid,D,i)) l=mid+1;
        else r=mid-1;
    }
    return r;
}
int id[N];
bool used[N];
ll Less[N];
bool check(ll D){
    used[0]=true;
    for(int i=1;i<=n;i++) Less[i]=calc(i,D);
    for(int i=1;i<=n;i++) id[i]=i,used[i]=false;
    sort(id+1,id+1+n,[](int x,int y){
        return Less[x]<Less[y];
    });
    int Now=0;
    for(int i=1;i<=n;i++){
        int u=id[i];
        while(!used[u]) used[u]=true,u=fa[u],Now++;
        if(Now>Less[id[i]]) return false;
    }
    return true;
}
int main(){
    // freopen("tree.in","r",stdin);
    // freopen("tree.out","w",stdout);
    n=read<int>();
    for(int i=1;i<=n;i++){
        a[i]=read<ll>(),b[i]=read<int>(),c[i]=read<int>();
        if(c[i]<0) z[i]=(b[i]-c[i]-1)/(-c[i]);
        else z[i]=INF+1;
    }
    for(int i=1;i<n;i++) add(read<int>(),read<int>());
    dfs0(1,0);
    ll l=0,r=1e9+5,mid;
    while(l<=r){
        mid=(l+r)>>1;
        if(check(mid)) r=mid-1;
        else l=mid+1;
    }
    printf("%lld\n",l);
}
2023/10/24 20:56
加载中...