rt,我用容斥搞了个 O(n3) 次方暴力,但是:
他跑的贼快,但是容斥部分并不会执行多次。
他错的点非常随机,每个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;
}