S T4 链部分分求调
  • 板块学术版
  • 楼主sunkuangzheng
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/10/22 08:05
  • 上次更新2023/11/2 12:02:27
查看原帖
S T4 链部分分求调
679936
sunkuangzheng楼主2023/10/22 08:05

感觉一条链的时候就是顺着种树,二分答案啊,不知道为什么寄了 /kel

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define iint __int128
const int N = 1e5+5;
int a[N],b[N],c[N],u,v,ans,n;
int ck(int x,int y,int id){
	int a1 = (y - x + 1) * b[id];
	iint yy = y,xx = x;
	iint a2 = (xx + yy) * (yy - xx + 1) / 2 * (__int128)(c[id]);
	int a3 = min(a2,(iint)a[id]);
	return a1 + a3;
}int gans(int id,int rr){
	int l = id,r = rr,ans = -1;
	while(l <= r){
		int mid = (l + r) / 2;
		if(ck(id,mid,id) >= a[id]) r = mid - 1,ans = mid; else l = mid + 1;
	}return ans;
}signed main(){
	//freopen("tree.in","r",stdin),freopen("tree.out","w",stdout);
	cin >> n;
	for(int i = 1;i <= n;i ++) cin >> a[i] >> b[i] >> c[i];
	for(int i = 1;i < n;i ++) cin >> u >> v;
	for(int i = 1;i <= n;i ++){
		if(c[i] < 0){
			int k = (b[i] - 1 - c[i] - 1) / (-c[i]);
			if(i > k) ans = max(ans,a[i] + i - 1);
			else{
				if(gans(i,k) != -1) ans = max(ans,gans(i,k));
				else{
					int x = ck(i,k,i);
					ans = max(ans,k + (a[i] - x));
				}
			}
		}else ans = max(ans,gans(i,1e9));
	}cout << ans;
}

2023/10/22 08:05
加载中...