95pts WA#15求调
查看原帖
95pts WA#15求调
549351
Izuko楼主2024/10/2 22:34

#15跟答案差1

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define PII pair<int,int>
#define MP make_pair
#define se second
#define fi first
const int N=1e5+7;
int n,tot,fa[N],ver[N<<1],Next[N<<1],head[N];
ll a[N],b[N],c[N],d[N];
bool vis[N];
PII node[N];
void add(int x,int y){
    ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
}
void dfs(int x,int f){
    fa[x]=f;
    for(int i=head[x];i;i=Next[i]){
		int y=ver[i];
		if(y!=f) dfs(y,x);
	}
}
int calc(int i,ll t,long double A,long double B,long double C){
    if((long double)t*t*A+t*B+C<=0) return (int)t;
    long double delta=B*B-4*C*A;
    if(delta<0) return -1;
    int dl=(int)floor((sqrtl(delta)-B)/(2*A));
    if(dl<=(i!=1)) return -1;
    return dl;
}
int negcalc(int i,ll t,long double A,long double B,long double C){
    if((long double)t*t*A+t*B+C<=0) return (int)t;
    long double delta=B*B-4*C*A;
    //if(delta<0) return -1;
    int dl=(int)floor((sqrtl(delta)+B)/(-2*A));
    if(dl<=(i!=1)) return -1;
    return dl;
}
bool check(ll t){//if(t<n) return 0;
    int dl;
    long double ai,bi,ci,di;
    FOR(i,1,n){ai=a[i],bi=b[i],ci=c[i],di=d[i];
        vis[i]=0;
        if(c[i]>0){
            dl=calc(i,t,c[i],2*b[i]-c[i],2*ai-(t+1)*(2*bi+ci*t));
            if(dl==-1) return 0;
            node[i]=MP(dl,i);
        }else if(c[i]==0){
            dl=t+1-(a[i]+b[i]-1)/b[i];
            if(dl<=(i!=1)) return 0;
            node[i]=MP(dl,i);
        }if(c[i]<0){
            if(t-d[i]>=a[i]) dl=t-a[i]+1,node[i]=MP(dl,i);
            else if(t<=d[i]){
                dl=negcalc(i,t,c[i],2*b[i]-c[i],2*ai-(t+1)*(2*bi+ci*t));
                if(dl==-1) return 0;
                node[i]=MP(dl,i);
            }else{
                dl=negcalc(i,t,c[i],2*b[i]-c[i],2*(ai-t+di)-(di+1)*(di*ci+2*bi));
                if(dl==-1) return 0;
                node[i]=MP(dl,i);
            }
        }
        //dl:第i块地最晚在第dl天种下
    }
    sort(node+1,node+n+1);
    int tm=0;
    FOR(i,1,n){
        int x=node[i].se;
        if(!vis[x]){
            dl=node[i].fi;
            for(;!vis[x];x=fa[x]) vis[x]=1,++tm;
            if(tm>dl) return 0;
        }
    }
    return 1;
}
signed main(){
    scanf("%d",&n);
    FOR(i,1,n){
        scanf("%lld%lld%lld",a+i,b+i,c+i);
        if(c[i]<0) d[i]=(1-b[i])/c[i];
    }
    int u,v;
    FOR(i,2,n) scanf("%d%d",&u,&v),add(u,v),add(v,u);
    dfs(1,0);vis[0]=1;
    ll l=n,r=1e9;
    while(l<r){
        ll mid=l+r>>1;
        if(check(mid)) r=mid; else l=mid+1;
    }
    //if(l==15028860) ++l;
    //
    printf("%lld",l);
    return 0;
}
2024/10/2 22:34
加载中...