rt,按照讲解思路选了四个点搞得,但是也有可能是我理解错了?
#include <bits/stdc++.h>
using namespace std;
int n,p[2005],ans;
char s[2005][2005];
int sum[2005][2005];
void chk(int l,int r,int _1x,int _1y,int _2x,int _2y) {
for (int y = 1;y <= n / 2 + 1;++y) {//枚举y
int y2 = y + n / 2 - 1;
int flag0 = (_1x >= l && _1x <= r && _1y >= y && _1y <= y2);
int flag1 = (_2x >= l && _2x <= r && _1y >= y && _1y <= y2);//2
if (!flag0 && flag1) flag1 = 1;
else if (!flag0 && !flag1) flag1 = 0;
else if (flag0 && !flag1) flag1 = -1;
else if (flag0 && flag1) flag1 = 0;
int _flag2 = (_2x >= l && _2x <= r && _2y >= y && _2y <= y2);
int flag2 = (_1x >= l && _1x <= r && _2y >= y && _2y <= y2);
if (!_flag2 && flag2) flag2 = 1;
else if (!_flag2 && !flag2) flag2 = 0;
else if (_flag2 && !flag2) flag2 = -1;
else if (_flag2 && flag2) flag2 = 0;
//分成之前有现在没,之前没现在有,之前有现在有,之前没现在没讨论。
// cerr << l << " " << r << " " << y << " " << y2 << " " << _1x << " " << _2x << " " <<
// sum[r][y2] - sum[r][y - 1] - sum[l - 1][y2] + sum[l - 1][y - 1] + (flag1 + flag2) << " " <<
// flag1 << " " << flag2 << " " << _1y << " " << _2y << '\n';
if (sum[r][y2] - sum[r][y - 1] - sum[l - 1][y2] + sum[l - 1][y - 1] + (flag1 + flag2) == 0) ++ans;
}
return void();
}
signed main() {
cin >> n;
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) cin >> p[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) {//挂一个x
int x2 = x + n / 2 - 1;
vector<int>P,Q;
int maxx = 0,pos = 0;
for (int j = 1;j <= n / 2;++j) if (maxx < p[j]) maxx = p[j],pos = j;
P.push_back(pos);
int minn = 1e9,pos2 = 0;
for (int j = n / 2 + 1;j <= n;++j) if (minn > p[j]) minn = p[j],pos2 = j;
P.push_back(pos2);
minn = 1e9,maxx = pos = pos2 = 0;
for (int j = 1;j < x;++j) {
if (maxx < p[j]) maxx = p[j],pos = j;
if (minn > p[j]) minn = p[j],pos2 = j;
}
for (int j = x2 + 1;j <= n;++j) {
if (maxx < p[j]) maxx = p[j],pos = j;
if (minn > p[j]) minn = p[j],pos2 = j;
}//上面在选点
Q.push_back(pos),Q.push_back(pos2);
for (auto a : P) for (auto b : Q) //选择讲解里面提到的点
chk(x,x2,a,p[a],b,p[b]);
}
return cout << ans << '\n',0;
}