二位前缀和50分,前五个点ac,后五个点wa,wa的点输出比答案小1
查看原帖
二位前缀和50分,前五个点ac,后五个点wa,wa的点输出比答案小1
326713
suyunqiaoKID楼主2021/9/11 12:06

RT,谢谢好心人

//#pragma GCC optimize(2)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#include<queue>
#include<vector>
#define INF 0x7fffffff
using namespace std;
const unsigned int N=1e4+15;
struct Node{
	int x;
	int y;
	int id;
}b[N];
bool cmp1(struct Node a,struct Node b){
	return a.x<b.x;
}
bool cmp2(struct Node a,struct Node b){
	return a.y<b.y;
}
int s[N][N],a[N][N],x[N],y[N];
int n,ans=INF;
void read(int &x){
	x=0;
	int y=1;
	char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')
		y=-1;
		ch=getchar();
	}
	while(isdigit(ch)){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	x*=y;
}
int square(int x1,int y1,int x2,int y2){
	return s[x2][y2]-s[x2][y1]-s[x1][y2]+s[x1][y1];
}//求区域奶牛个数
signed main(){
	read(n);
	for(register int i=1;i<=n;i++){
		read(b[i].x);
		read(b[i].y);
		b[i].id=i;
	}
	sort(b+1,b+n+1,cmp1);
	for(register int i=1;i<=n;i++)
	x[b[i].id]=i;
	sort(b+1,b+n+1,cmp2);
	for(register int i=1;i<=n;i++)
	y[b[i].id]=i;
	for(register int i=1;i<=n;i++)
	a[x[i]][y[i]]++;//离散化
	for(register int i=1;i<=n;i++)
	for(register int j=1;j<=n;j++)
	s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];//前缀和预处理
	for(register int i=1;i<=n+1;i++)
	for(register int j=1;j<=n+1;j++){
		int vmax=-1;
		int v1=square(1,1,i,j);
		int v2=square(1,j,i,n);
		int v3=square(i,1,n,j);
		int v4=square(i,j,n,n);
		vmax=max(vmax,v1);
		vmax=max(vmax,v2);
		vmax=max(vmax,v3);
		vmax=max(vmax,v4);
		ans=min(vmax,ans);
	}
	printf("%d\n",ans);
	return 0;
}
2021/9/11 12:06
加载中...