两个关于简单暴力+容斥做法奇特问题
查看原帖
两个关于简单暴力+容斥做法奇特问题
895690
gghack_Nythix楼主2024/10/5 10:12

rt,我用容斥搞了个 O(n3)O(n^3) 次方暴力,但是:

  • 他跑的贼快,但是容斥部分并不会执行多次。

  • 他错的点非常随机,每个sub错1~2个,但是关了O2就有65pts了。

请问这是什么问题?

#include <bits/stdc++.h>
using namespace std;
int n,p[2005],ans;
char s[2005][2005];
int sum[2005][2005];
int qsum(int x,int y,int x2,int y2){
	return sum[x2][y2] - sum[x2][y - 1] - sum[x - 1][y2] + sum[x - 1][y - 1];
}
int w(int x) {return x * (x - 1) / 2;}
int w2(int x,int y) {return x * y;}
signed main() {
	cin >> n;
	n = 10;
	for (int i = 1;i <= n;++i) p[i] = i;
	do{
		for (int i = 1;i <= n;++i)
		for (int j = 1;j <= n;++j)
		s[i][j] = '0';
		for (int i = 1;i <= n;++i) s[i][p[i]] = '1';	
		for (int i = 1;i <= n;++i)
		for (int j = 1;j <= n;++j)
		sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + (s[i][j] == '1');
		for (int x = 1;x <= n / 2 + 1;++x) {
			for (int y = 1;y <= n / 2 + 1;++y) {
				int x2 = x + n / 2 - 1,y2 = y + n / 2 - 1;
				if (qsum(x,y,x2,y2) == 0) {
					int a = qsum(1,1,n,y - 1);
					int b = qsum(x2 + 1,1,n,n);
					int c = qsum(1,y2 + 1,n,n);
					int d = qsum(1,1,x - 1,n);
					int e = qsum(1,1,x - 1,y - 1);
					int f = qsum(x2 + 1,1,n,y - 1);
					int g = qsum(x2 + 1,y2 + 1,n,n);
					int h = qsum(x - 1,y2 + 1,1,n);
					ans += (w(a) + w(b) + w(c) + w(d) + w2(a,c) + w2(b,d) - 2 * w(e) - 2 * w(f) - 2 * w(g) - 2 * w(h));
				}
				else if (qsum(x,y,x2,y2) == 1) {
					int _1x = 0,_1y = 0;
					for (int i = 1;i <= n;++i) 
					if (i >= x && i <= x2 && p[i] >= y && p[i] <= y2){_1x = i,_1y = p[i];break;}
					for (int i = 1;i <= n;++i) {
						if (!(i >= x && i <= x2 && p[i] >= y && p[i] <= y2)) {
							int _2x = i,_2y = p[i];
							int flag1 = (_2x >= x && _2x <= x2 && _1y >= y && _1y <= y2);
							int flag2 = (_1x >= x && _1x <= x2 && _2y >= y && _2y <= y2);
							if (flag1 + flag2 == 0) ++ans;
						}
					}
				}
			}
		}
		
		if (ans >= 500) cout << ans << '\n';
		ans = 0;
	}while(next_permutation(p + 1,p + n + 1));
	cout << "done\n";
	return 0;
}
2024/10/5 10:12
加载中...