求助qwq,AC后想问问dalao们关于此题时间复杂度的问题
查看原帖
求助qwq,AC后想问问dalao们关于此题时间复杂度的问题
393190
aldol_reaction楼主2020/12/16 19:48

蒟蒻建图的AC代码片段在最后面。 我没开O2,用的vector存边,827msAC。但是此题复杂度是O(nnm),1e9是怎么卡过1s的?我记得1s时间复杂度两千万是可以过的。

还有个问题是,常数优化的数量级范围是多少呢。

还有想问一下我一直不懂的地方

for(int j = start; j <= endd; ++j) {
	if(stand_bool[j]) {
		for(int k = start; k <= endd; ++k) {
			if(!stand_bool[k] && !exit_edge[j][k]) {
				++in[j], ++out[k];
				e[k].push_back(j);
				exit_edge[j][k] = 1;
			}

这个AC代码片段.n个点至多n/2个停下来,n/2不停下来,这样乘起来时间复杂度最大。变成O(nnm/4)。但是每一次循环我都需要在if判断,这个if判断算不算在时间复杂度里面呢...算的话不就是O(nnm)了吗。(好蒟蒻的问题QAQ) 完整建图部分的AC代码

void inp() {
	cin >> n >> m;

	for(int i = 1; i <= m; ++i) {
		int s = 0;
		scanf("%d", &s);
		memset(stand_bool, 0, sizeof(stand_bool));

		for(int j = 1; j <= s; ++j) {
			scanf("%d", &stand_num);
			stand_bool[stand_num] = 1;

			if(j == 1) {
				start = stand_num;
				if(final_start > start) final_start = start;
			}
			if(j == s) {
				endd = stand_num;
				if(final_endd < endd) final_endd = endd;
			}
		}

		for(int j = start; j <= endd; ++j) {
			if(stand_bool[j]) {
				for(int k = start; k <= endd; ++k) {
					if(!stand_bool[k] && !exit_edge[j][k]) {
						++in[j], ++out[k];
						e[k].push_back(j);
						exit_edge[j][k] = 1;
					}
				}
			}
		}
	}
}
2020/12/16 19:48
加载中...