25 pts WA 求助玄关
查看原帖
25 pts WA 求助玄关
775991
jianamisabina楼主2024/9/12 22:50

采用的是第一篇题解的思路。

#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <stack>
#define int __int128
using namespace std;

const int N = 1e5 + 10,M = 25,mod = 998244353;

inline void read(int &n){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        x=(x<<1)+(x<<3)+(ch^48);
        ch=getchar();
    }
    n=x*f;
}
inline void print(int n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n % 10 + '0');
}

struct node{
    int tim,pos;
}t[N];

int a[N],b[N],c[N],n;
int f[N],son[N],vis[N];
vector <int> G[N];

int sum(int p,int q,int d){
    int num = (q - p) / d + 1;
    return (p + q) * num / 2;
}

int calc(int i,int x){
    if(c[i] > 0) return sum(b[i] + c[i],b[i] + x * c[i],c[i]);
    else if(c[i] == 0) return b[i] * x;
    else{
        int f = (1 - b[i]) / c[i];
        if(f <= 0 || f > x) return sum(b[i] + c[i],b[i] + x * c[i],c[i]);
        else return sum(b[i] + c[i],b[i] + f * c[i],c[i]) + x - f;
    }
}

int query(int i,int l,int r){
    return calc(i,r) - calc(i,l - 1);
}

void dfs(int u,int fa){
    f[u] = fa;//son[fa] = u;
    for(auto v : G[u]){
        if(v == fa) continue;
        dfs(v,u);
    }
}

bool cmp(node n1,node n2){
    return n1.tim < n2.tim;
}

bool check(int day){
    memset(t,0,sizeof(t));
    memset(vis,0,sizeof(vis));
    for(int i = 1;i <= n;i ++){
        if(calc(i,day) < a[i]) return false;
        else{
            int l = 1,r = day;
            while(l < r){//cout << 1;
                int mid = (l + r + 1) / 2;
                //cerr << i << ' ' << mid << '\n';
                if(query(i,mid,day) >= a[i]){
                    l = mid;
                }else{
                    r = mid - 1;
                }
            }
            t[i].pos = i,t[i].tim = l;
        }
    }//return 1;
    sort(t + 1,t + n + 1,cmp);
    vis[0] = 1;int sumtim = 0;//return 0;
    for(int i = 1;i <= n;i ++){
        int pos = t[i].pos,tim = t[i].tim;
        if(!vis[pos]){
            int k = pos;
            while(!vis[k]){
				sumtim ++;vis[k] = 1;
                k = f[k];// son[f[k]] = k;
            }
            if(sumtim > tim) return false;
        }
    }
    return true;
}

signed main(){
    ios::sync_with_stdio(0);cin.tie(0);
    //maketag(1,1,1,1);
    //freopen("fountain4.in","r",stdin);
    read(n);
    for(int i = 1;i <= n;i ++){
		read(a[i]);read(b[i]);read(c[i]);
	}	
    //cout << query(2,5,4);return 0;
    for(int i = 1;i < n;i ++){
		int u,v;read(u);read(v);
        G[u].push_back(v);G[v].push_back(u);
    }
    long long l = n,r = 1e9;
    while(l < r){
        int mid = (l + r) / 2;//cerr <<mid;
        if(check(mid)){
            r = mid;
        }else{
            l = mid + 1;
        }
    }
   print(l);

    return 0;
}

2024/9/12 22:50
加载中...