求分析一个求和式的上界
  • 板块学术版
  • 楼主Zhang_Wenjie
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/28 13:48
  • 上次更新2024/9/28 16:09:12
查看原帖
求分析一个求和式的上界
481621
Zhang_Wenjie楼主2024/9/28 13:48

我这个程序的复杂度瓶颈应该是 O(i=1nni)\large O(\sum\limits_{i=1}^{n}\frac{n}{i}),肯定是小于 n2n^2 的,实测是过不了 n=105n=10^5 的,求分析这个复杂度的上界

#include <bits/stdc++.h>
#define re register int 
#define int long long 
#define min(x, y) (x < y ? x : y)

using namespace std;
typedef long long LL;
const int N = 1e5 + 10, logN = 50, inf = 1e9 + 1;

int n, m, f[N], s[N];
int st[N][logN], lg[N];
LL sum[N];

inline void init()
{
	lg[0] = -1;
	for (re i = 1; i <= n; i ++) lg[i] = lg[i / 2] + 1;
	
	for (re j = 1; j <= lg[n]; j ++)
		for (re i = 1; i + (1 << j) - 1 <= n; i ++)
			st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	
	cin >> n >> m;
	for (re i = 1; i <= n; i ++)
	{
		cin >> f[i] >> s[i];
		sum[i] = sum[i - 1] + f[i];
		st[i][0] = s[i];
	}
	init();
	LL ans = inf;
	for (re len = 1; len <= n; len ++)
		for (re l = 1; l + len - 1 <= n; l ++)
		{
			int r = l + len - 1;
			if (sum[r] - sum[l - 1] >= m)
			{
				int k = lg[r - l + 1];
				int res = max(st[l][k], st[r - (1 << k) + 1][k]);
				ans = min(res, ans);
			}
		}
	cout << ans << '\n';
	
	return 0;
}
2024/9/28 13:48
加载中...