0pts,预计打65pts的代码求条,玄关
查看原帖
0pts,预计打65pts的代码求条,玄关
895690
gghack_Nythix楼主2024/10/4 21:33

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;
}
2024/10/4 21:33
加载中...