Load Balancing S
通过这道题目来学习一下离散化二维前缀和思想
这里最多
来看一下代码细节,代码只离散化了
#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;
}
然后可以看看加强版,很简单的题目肯定没有紫,可以用倍增+树状数组的技巧,随便当个练习题练练就好了
update 2024.7.7
离散化二维前缀和可以两个维度都离散化,这样的话就可以像普通的二维前缀和一样,使用数组记录对应的前缀和;当然以后用的时候也可以像这道题目一样,尝试只离散化一维,剩下的尝试实时统计
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构