CF1872G

题意:一个正整数序列,a[i]<109,求 lr,最大化

i=1l1a[i]+i=lra[i]+i=r+1na[i]

诈骗题。

如果在 [l,r] 间乘积的 T 中去除一个数 x,对答案的贡献为 f(x)=xT/x
若去除任意一个 x 都不会变优,由于是单增的,则

f(109)<0

T>1018

所以一旦整个序列之积 >1018l 即为最左侧 >1 的位置,r 为最右侧 >1 的位置。

否则,大于 1 的数的个数 <60,枚举左右端点即可。
实际上这个上界远小于 1018,只不过这样更好想且也能轻松通过。

void solve() {
	int n; cin >> n;
	vector<ll> a(n + 1), sum(n + 1, 0), mul(n + 1, 1);
	vector<int> pos;
	rep(i, 1, n) cin >> a[i];
	rep(i, 1, n) {
		if(mul[i - 1] > 1e15 / a[i]) {
			int l = 1, r = n ;
			while(l < n && a[l] == 1) ++ l;
			while(r > 1 && a[r] == 1) -- r;
			return cout << l << ' ' << r << '\n', void();
		}
		if(a[i] > 1) pos.pb(i);
		sum[i] = sum[i - 1] + a[i];
		mul[i] = mul[i - 1] * a[i];
	}
	int l = 1, r = 1;
	ll ans = 0;
	for(int i : pos) {
		for(int j : pos) {
			if(i <= j) {
				if(sum[i - 1] + (mul[j] / mul[i - 1]) + (sum[n] - sum[j]) > ans) {
					ans = sum[i - 1] + (mul[j] / mul[i - 1]) + (sum[n] - sum[j]);
					l = i;
					r = j;
				}				
			}	
		}
	}
	cout << l << ' ' << r << '\n';
}

作者:Luxinze

出处:https://www.cnblogs.com/Luxinze/p/18011909

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   Lu_xZ  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示