社区讨论

为什么O(n^3)可以过n<=1000的点

P15361「WYZOI R2」拜年参与者 7已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
7 条
当前快照
1 份
快照标识符
@mlpyb416
此快照首次捕获于
2026/02/17 09:55
前天
此快照最后确认于
2026/02/17 21:56
前天
查看原帖
这是我的代码
CPP
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
const int M = 1e3 + 10;
int n,a[10][N],v[10][N],m[M][M],t,ans;
int dx[]={0,1,-1,0,0},dy[]={0,0,0,1,-1};
void dfs(int x,int y,int l,int r){
	v[x][y]=1;
	for(int i = 1; i <= 4; i++){
		int qx=x+dx[i],qy=y+dy[i];
		if(1<=qx&&qx<=2&&1<=qy&&qy<=n&&a[qx][qy]>=l&&a[qx][qy]<=r&&!v[qx][qy]){
			dfs(qx,qy,l,r);
		}
	}
}
void solve(){
	cin >> n;int flg=1;
	for(int i = 1; i <= 2; i++){
		for(int j = 1; j <= n; j++){
			cin >> a[i][j];
			if(a[i][j]!=a[1][1])flg=0;
		}
	} 
	if(flg){
		cout << a[1][1]*(2*n-a[1][1]+1) << endl;
		return;
	}
	ans=0;
	for(int i = 1; i <= 2*n; i++){
		for(int j = i; j <= 2*n; j++){
			if(a[1][1]<i||a[1][1]>j)continue;
			for(int k = 1; k <= n; k++)v[1][k]=v[2][k]=0;
			dfs(1,1,i,j);if(v[2][n])ans++;
		}
	}
	cout << ans << endl;
}
int main(){
	cin >> t;
	while(t--)solve();
	return 0;
}
dfsO(n)O(n) 的, 29~30 行的循环是 O(n2)O(n^2) ,总共是 O(n3)O(n^3) 的,但过了n<=1000的点,有没有人来看一下,是没跑满还是数据水还是常数问题?

回复

8 条回复,欢迎继续交流。

正在加载回复...