Load Balancing S

通过这道题目来学习一下离散化二维前缀和思想

这里最多\(1000\)头牛,涉及的\(x\)\(y\)最多各为\(1000\)个,于是离散化之后最多形成一个\(1000\times 1000\)的矩阵,完全可以二维前缀和

来看一下代码细节,代码只离散化了\(x\),没有离散化\(y\),简化了代码复杂度

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1010,M=1e6+10;
int n;
struct Node
{
	int x,y;
}cow[N];
int num[M],sum[N],line[N];
int read()
{
    int x=0,f=1;
    char s=getchar();
    while(s<'0'||s>'9')
    {
        if(s=='-')
        f=-f;
        s=getchar();
    }
    while(s>='0'&&s<='9')
    {
        x=x*10+s-48;
        s=getchar();
    }
    return x*f;
}
bool cmp(Node i,Node j)
{
	if(i.y==j.y) return i.x<j.x;
	return i.y<j.y;
}
int main()
{
	int cnt=0;
	n=read();
	for(int i=1;i<=n;i++)
	{
		cow[i].x=read(),cow[i].y=read();
		num[cow[i].x+1]++; 
	 } 
	for(int i=2;i<=1e6;i+=2)
	if(num[i])
	{
		line[++cnt]=i;
		sum[cnt]=sum[cnt-1]+num[i];
	}
	sort(cow+1,cow+n+1,cmp);
	int ans=0x7fffffff;
	for(int i=1;i<=cnt;i++)//枚举x=a 
	{
		int sum1=0,sum2=0,sum3,sum4,lastcow=0;
		for(int j=1;j<=n;j++)//枚举y=b 
		{
			if(cow[j].y>cow[j-1].y)//不同了说明y增加了,相当于枚举y=b 
			{
			    int tot1=0,tot2=0;
			    for(int k=lastcow;k&&k<j;k++)//统计左下和右下的数目 
			    {
			        if(cow[k].x<line[i]) tot1++;
			        else tot2++;
			    }
			    lastcow=j;
			    sum1+=tot1;
			    sum3=sum[i]-sum1;
			    sum2+=tot2;
			    sum4=n-sum[i]-sum2;
			    ans=min(ans,max(sum1,max(sum2,max(sum3,sum4))));
			}
		}
	}
	printf("%d",ans);
	return 0;
}

然后可以看看加强版,很简单的题目肯定没有紫,可以用倍增+树状数组的技巧,随便当个练习题练练就好了

posted @ 2024-04-28 12:59  最爱丁珰  阅读(2)  评论(0编辑  收藏  举报