[JXOI2018] 守卫

#include<cstdio>
#include<algorithm>
using namespace std;
int a[5005],f[5005][5005],n,vis[5005][5005];

double slope(int x,int y) {return (a[x] - a[y]) * 1.0 / (x - y);}
int main()
{
	scanf("%d",&n);
	for (int i = 1; i <= n; i++) scanf("%d",&a[i]),f[i][i] = 1;
	for (int i = 2; i <= n; i++)
	{
		double mn = 2147483647;
		for (int j = i - 1; j >= 1; j--)
			if (mn > slope(i,j)) mn = slope(i,j),vis[i][j] = 1;
	}
	for (int i = 2; i <= n; i++)
	{
		int pre = i;
		for (int j = i - 1; j >= 1; j--)
			if (vis[i][j]) pre = j,f[j][i] = f[pre + 1][i] + min(f[j][pre],f[j][pre - 1]);
			else f[j][i] = f[pre + 1][i] + min(f[j][pre],f[j][pre - 1]);
	}
	int ans = 0;
	for (int i = 1; i <= n; i++)
		for (int j = i; j <= n; j++)
			ans = ans ^ f[i][j];
	printf("%d\n",ans);
}
posted @ 2022-01-24 16:09  RiverSheep  阅读(38)  评论(0)    收藏  举报