关于 S T4
查看原帖
关于 S T4
482610
Mortidesperatslav楼主2023/10/28 16:20
#include<bits/stdc++.h>
#define int long long
int n,a[100005],b[100005],c[100005];
int dis[100005];
bool vis[22],Cang[22];
bool fl=0,fl2=0;
int Dfsans=0;
std::vector<int>G[100005];
struct node {
	public:
		int id,val;
		bool operator <(node b)const {
			return b.val<this->val;
		}

} p[100005];
int GetAns(int x,int y) {
	int l=1,r=x,ans;
	while(l<=r) {
		int mid=(l+r)>>1;
		if(y*mid+x<=0)ans=mid,r=mid-1;
		else l=mid+1;
	}
	return ans;
}
signed main() {
	scanf("%lld",&n);
	for(int i=1; i<=n; i++) {
		scanf("%lld%lld%lld",&a[i],&b[i],&c[i]);
		if(c[i]!=0)fl=1;
	}
	for(int i=1; i<n; i++) {
		int u,v;
		scanf("%lld%lld",&u,&v);
		if(u!=v-1)fl2=1;
		G[u].push_back(v);
	}
	int ans=0;
	for(int i=1; i<=n; i++) {
		if(c[i]>=0) {
			int l=1,r=1000000000,aans=0;
			while(l<=r) {
				int mid=(l+r)>>1;
				int hig=b[i]*(mid-i+1)+c[i]*((i+mid)*(mid-i+1)>>1);
				if(hig>=a[i])aans=mid,r=mid-1;
				else l=mid+1;
			}
			ans=std::max(aans,ans);
		} else {
			int Sj=GetAns(b[i],c[i]);
			int l=1,r=1000000000,aans=0;
			while(l<=r) {
				int mid=(l+r)>>1;
				int hig;
				if(mid>=Sj)hig=b[i]*(Sj-i)+(mid-(Sj-1)-(i-1));
				else hig=b[i]*(mid-i+1)+c[i]*((i+mid)*(mid-i+1)>>1);
				if(hig>=a[i])aans=mid,r=mid-1;
				else l=mid+1;
			}
			ans=std::max(aans,ans);
		}
	}
	printf("%lld",ans);
	return 0;
}

为什么洛谷一分不得,测了几组特殊性质 B 都没挂。

2023/10/28 16:20
加载中...