CSP-S T4求调
  • 板块学术版
  • 楼主Rash10
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/23 15:23
  • 上次更新2023/11/2 11:43:33
查看原帖
CSP-S T4求调
511408
Rash10楼主2023/10/23 15:23
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005,M=N*2;
int n,num_edge,ansss;
int head[M],ljd[N],f[N],__[N];
__int128 _=1;
bitset<N>vis;
struct Land{
    int b,c,ti,tii;
    int a;
}d[N];
struct Edge{
    int to,net;
}edge[M];
void add_edge(int from,int to){
    edge[++num_edge].net=head[from];
    edge[num_edge].to=to;
    head[from]=num_edge;
}
void dfs1(int now,int fa){
    f[now]=fa;
    for(int i=head[now];i;i=edge[i].net){
        if(edge[i].to==fa) continue;
        dfs1(edge[i].to,now);
    }
}
bool check3(int stad,int now,int st){
    if(_*(d[now].b+d[now].c*st+d[now].b+d[now].c*stad)*(stad-st+1)>=d[now].a*2) return true;
    return false;
}//+
bool check2(int stad,int now,int st){
    if(stad<=d[now].ti){
        if(_*(d[now].b+d[now].c*st+d[now].b+d[now].c*stad)*(stad-st+1)>=d[now].a*2) return true;
        else return false;
    }
    if(st>d[now].ti){
        if((stad-st+1)>=d[now].a) return true;
        else return false;
    }
    else{
        if(_*(d[now].b+d[now].c*st+d[now].b+d[now].c*d[now].ti)*(d[now].ti-st+1)+(stad-(d[now].ti+1)+1)*2>=d[now].a) return true;
        return false;
    }
}//-
bool check4(int stad,int now){
    if(d[now].c*stad+d[now].b<=0) return true;
    return false;
}
bool cmp(int x,int y){
    return d[x].tii<d[y].tii;
}
bool check1(int stan){
    int oo=0;
    for(int i=1;i<=n;i++){
        int anss=-1;
        int l=1,r=stan;
        if(d[i].c<0){
            while(l<=r){
                int mid=(l+r)>>1;
                if(check2(stan,i,mid)==true){
                    anss=mid;
                    l=mid+1;
                }
                else r=mid-1;
            }        
        }
        else{
            while(l<=r){
                int mid=(l+r)>>1;
                if(check3(stan,i,mid)==true){
                    anss=mid;
                    l=mid+1;
                }
                else r=mid-1;
            }
        }
        d[i].tii=anss;
    }
    vis.reset();
    for(int i=1;i<=n;i++){
        __[i]=i;
    }
    sort(__+1,__+n+1,cmp);
    for(int i=1;i<=n;i++){
        int now=__[i];
        vector<int>vec;
        vec.clear();
        while(vis[now]==0&&now!=0){
            vis[now]=1;
            vec.push_back(now);
            now=f[now];
        }
        reverse(vec.begin(),vec.end());
        for(int j:vec){
            oo++;
            if(oo>d[j].tii) return false;
        }
    }
    return true;
}
int read(){
    int r=0,f=1;
    char c=getchar();
    while(!isdigit(c)){
        if(c=='-') f=0;
        c=getchar();
    }
    while(isdigit(c)){
        r=(r<<1)+(r<<3)+c-48;
        c=getchar();
    }
    return f?r:-r;
}
void write(int x){
    if(x>=10) write(x/10);
    putchar(x%10^48);
}
signed main(){
    n=read();
    for(int i=1;i<=n;i++){
        d[i].a=read(),d[i].b=read(),d[i].c=read();
        if(d[i].c<0){
            int l=1,r=1000000000,ansss;
            while(l<=r){
                int mid=(l+r)>>1;
                if(check4(mid,i)==true){
                    r=mid-1;
                    ansss=mid;
                }
                else l=mid+1;
            }
            d[i].ti=ansss-1;
        }
    }
    for(int i=1;i<n;i++){
        int u,v;
        u=read();
        v=read();
        add_edge(u,v);
        add_edge(v,u);
    }
    dfs1(1,0);
    int l=1,r=1000000000,ans=114514;
    // if(check1(r)==true) cout<<"qwq";
    // for(int i=1;i<=n;i++){
    //     if(d[i].tii<0) cout<<'-',write(-d[i].tii);
    //     else write(d[i].tii);
    //     cout<<' ';
    //     if(d[i].ti<0) cout<<'-',write(-d[i].ti);
    //     else write(d[i].ti);        
    //     cout<<endl;
    // }
    while(l<=r){
        int mid=(l+r)>>1;
        if(check1(mid)==true){
            ans=mid;
            r=mid-1;
        }
        else{ l=mid+1;}
    }
    // assert(ans!=114514);   
    write(ans);
    return 0;
}
2023/10/23 15:23
加载中...