求助评时间复杂度
  • 板块学术版
  • 楼主rainygame
  • 当前回复3
  • 已保存回复3
  • 发布时间2023/8/6 20:20
  • 上次更新2023/11/3 05:31:37
查看原帖
求助评时间复杂度
804607
rainygame楼主2023/8/6 20:20

题目

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define MAXN 1001
#define MAXM 500001

int n, q, v, ind, lans, cnt;
int it[MAXN], ans[MAXM];
int a[MAXN][MAXN];

struct Node{
	int ind, v;
}nodes[MAXM];

bool cmp(Node a, Node b){
	return a.v > b.v;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    
    cin >> n >> q;
    for (int i(1); i<=n; ++i){
    	for (int j(1); j<=n; ++j) cin >> a[i][j];
    	sort(a[i]+1, a[i]+n+1, greater<int>());
    	it[i] = 1;
	}
	for (int i(1); i<=q; ++i){
		cin >> nodes[i].v;
		nodes[i].ind = i;
	}
	sort(nodes+1, nodes+q+1, cmp);
	
	for (int i(1); i<=q; ++i){
		v = nodes[i].v;
		ind = nodes[i].ind;
		cnt = 0;
		for (int j(1); j<=n; ++j){
			while (it[j] <= n && a[j][it[j]] >= v){
				++it[j];
				++cnt;
			}
		}
		ans[ind] = min(lans+cnt, n);
		lans = ans[ind];
	}
	for (int i(1); i<=q; ++i) cout << ans[i] << '\n';

    return 0;
}

这是离线的代码。显然,最内层的循环最多只会执行 n2n^2 次。

那我能不能把时间复杂度简单地算为 O(n2log⁡n+n2+qlog⁡q+q)=O(n2log⁡n+qlog⁡q)O(n^2 \log n+n^2 +q \log q+q)=O(n^2 \log n+q \log q)。

尽管有一个 qq 次的循环套一个 nn 次的循环,但是复杂度却优于 O(nq)O(nq)。有点令人不可置信。

2023/8/6 20:20
加载中...