Portal

Description

给出平面上的\(n(n\leq10^5)\)个整点。画两条直线\(x=x_0\)和\(y=y_0\)将这些点划分成\(s_1,s_2,s_3,s_4\)个点,最小化\(max\{s_1,s_2,s_3,s_4\}\)。

Solution

二分答案+线段树。
首先进行离散化,记录\(sumY[i]\)表示\(y\leq i\)的点的个数。
检查\(m\)是否合法时,枚举\(x_0\)并查找是否存在合法的\(y_0\)。将↖称为\(s_1\),↙称为\(s_2\),↗称为\(s_3\),↘称为\(s_4\)。那么我们找到使得\(s_1,s_2\leq m\)的最大的\(y_0\),然后检查\(s_3,s_4\)是否不超过\(m\)。我们将\(x\leq x_0\)的点加入线段树,在线段树上二分来找到最大的\(y_0\)使得线段树上\([1,y_0]\)中的点数和(即\(s_1\))不超过\(m\),\(s_2=sumY[y_0]-s_1\)也不超过\(m\)。找到\(y_0\)后检查\(s_3=sum[rt]-s_1,s_4=n-s_1-s_2-s_3\)是否均不超过\(m\),若均合法则说明\(ans\leq m\),否则继续枚举\(x_0\)。若对于所有\(x_0\)均不存在合法的\(y_0\),则说明\(ans>m\)。

时间复杂度\(O(nlog^2n)\)。

Code

//[Usaco2016 Feb]Load balancing
#include <algorithm>
#include <cstdio>
using namespace std;
inline char gc()
{static char now[1<<16],*s,*t;if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}return *s++;
}
inline int read()
{int x=0; char ch=gc();while(ch<'0'||'9'<ch) ch=gc();while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();return x;
}
const int N=1e5+10;
int n,nX,nY; int sumY[N];
struct point{int x,y;} pt[N];
bool cmpX(point x,point y) {return x.x<y.x;}
int mapX[N],mapY[N];
void discrete()
{for(int i=1;i<=n;i++) mapX[i]=pt[i].x,mapY[i]=pt[i].y;sort(mapX+1,mapX+n+1); nX=unique(mapX+1,mapX+n+1)-mapX-1;for(int i=1;i<=n;i++) pt[i].x=lower_bound(mapX+1,mapX+nX+1,pt[i].x)-mapX;sort(mapY+1,mapY+n+1); nY=unique(mapY+1,mapY+n+1)-mapY-1;for(int i=1;i<=n;i++) pt[i].y=lower_bound(mapY+1,mapY+nY+1,pt[i].y)-mapY;sort(pt+1,pt+n+1,cmpX);
}
const int Ns=4e5+10;
#define Ls (p<<1)
#define Rs (p<<1|1)
int rt,sum[Ns]; int clr[Ns];
int optL,optR;
void update(int p) {sum[p]=sum[Ls]+sum[Rs];}
void pushdw(int p) {if(clr[p]) sum[Ls]=sum[Rs]=0,clr[Ls]=clr[Rs]=true,clr[p]=false;}
void ins(int p,int L0,int R0,int x,int v)
{if(L0==R0) {sum[p]+=v; return;}pushdw(p);int mid=L0+R0>>1;if(x<=mid) ins(Ls,L0,mid,x,v);else ins(Rs,mid+1,R0,x,v);update(p);
}
int query1(int p,int L0,int R0,int s1,int x)
{if(L0==R0) return L0;pushdw(p);int mid=L0+R0>>1; int t1=s1+sum[Ls],t2=sumY[mid]-t1;if(x<t1||x<t2) return query1(Ls,L0,mid,s1,x);else return query1(Rs,mid+1,R0,t1,x);
}
int query2(int p,int L0,int R0)
{if(optL<=L0&&R0<=optR) return sum[p];pushdw(p);int mid=L0+R0>>1; int res=0;if(optL<=mid) res+=query2(Ls,L0,mid);if(mid<optR) res+=query2(Rs,mid+1,R0);return res;
}
bool check(int m)
{rt=1; sum[rt]=0,clr[rt]=true;for(int i=1,t=1;i<=nX;i++){while(pt[t].x==i) ins(rt,1,nY,pt[t].y,1),t++;if(sum[rt]>m+m) break;else if(n-sum[rt]>m+m) continue;int j=query1(rt,1,nY,0,m)-1;optL=1,optR=j; int s1=query2(rt,1,nY);int s2=sumY[j]-s1,s3=sum[rt]-s1,s4=n-s1-s2-s3;if(s1>m||s2>m) printf("query1 GG\n");if(s3<=m&&s4<=m) return true; }return false;
}
int main()
{n=read();for(int i=1;i<=n;i++) pt[i].x=read(),pt[i].y=read();discrete();for(int i=1;i<=n;i++) sumY[pt[i].y]++;for(int i=1;i<=nY;i++) sumY[i]+=sumY[i-1];int L=n/4-1,R=n;while(L<=R){int mid=L+R>>1;if(check(mid)) R=mid-1;else L=mid+1;}printf("%d\n",L);return 0;
}

P.S.

sro Icefox的\(O(nlogn)\)做法 orz,比我强多啦

转载于:https://www.cnblogs.com/VisJiao/p/BZOJ4411.html

BZOJ4411 - [Usaco2016 Feb]Load balancing相关推荐

  1. 科普|什么是负载均衡(Load balancing)

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者 | Enter 来源 | cnblogs.com/kingr ...

  2. 负载均衡(Load Balancing)学习笔记(二)

    概述 文章负载均衡(Load Balancing)学习笔记(一) 讲述了负载均衡的一般性原理,本文继续介绍常见的实现负载均衡的方法. HTTP重定向 HTTP重定向服务器是一台普通的Web服务器,用户 ...

  3. 网页加载出现没有合适的负载均衡器_终于讲清楚了,什么是负载均衡(Load balancing)...

    什么是负载均衡(Load balancing) 在网站创立初期,我们一般都使用单台机器对台提供集中式服务,但随着业务量越来越大,无论性能还是稳定性上都有了更大的挑战.这时候我们就会想到通过扩容的方式来 ...

  4. ASA/PIX: Load balancing between two ISP - options

    ASA/PIX: Load balancing between two ISP - options VERSION 7  Is it possible to load balance between ...

  5. nginx tcp代理_nginx——TCP/UDP Load Balancing

    nginx––– tcp and udp 代理 Introduction nginx 反向代理一般都是7层代理,进行http/https 协议层的转发:说起4层代理,一般想到的都是lvs 和 hapr ...

  6. Nginx(四):负载均衡Load balancing

    1.概念基础 Load balancing,即负载均衡,是一种计算机技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载,以达到最优化资源使用.最大化吞吐率.最小化响 ...

  7. UVA 12904 Load Balancing 暴力

    Load Balancing Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/vi ...

  8. 网络负载平衡(Network Load Balancing)的工作原理

    NLB算法的特点: 在NLB群集中,每台服务器都会有一个属于自己的静态IP地址,同时NLB群集中的所有服务器还有一个共同的IP地址-NLB群集地址: 当客户向NLB群集(NLB的虚拟IP地址)发起请求 ...

  9. PLB: Congestion Signals are Simple and Effective for Network Load Balancing读后思考

    这周我读的论文是PLB: Congestion Signals are Simple and Effective for Network Load Balancing.这篇论文是谷歌提出的一个建立在传 ...

最新文章

  1. replace函数对dataframe中的值进行替换(所有数据列中的相同值)
  2. 我们可以无损放大一个Transformer模型吗?
  3. 5.1 tushare包介绍
  4. SQLServer Agent无法启动,提示错误1069
  5. python判断一个对象是否可迭代_python - 在Python中,如何确定对象是否可迭代? - includeStdio...
  6. 【ElasticSearch】 Hive数据导入到 es 的 项目 FastIndex
  7. qlistwidget窗口隐藏会发送什么信号_为什么wifi连的人越多,就越慢?
  8. sentinel-2数据下载 大气校正 转ENVI格式
  9. ADS2017破解后重启显示license失效,需要把EESoft Flexnet Licence Server启动类型设置为自动
  10. 检查pdf字体是否全部嵌入
  11. ESP8266固件SDK开发初体验-让ESP8266打印helloworld(基于安信可ESP-07)
  12. 用Peering Connections将多个VPC私网打通
  13. “华为杯”山东理工大学第十一届 ACM程序设计竞赛 我不是股神
  14. ipv6的127位掩码如何表示_子网掩码是什么
  15. MySQL通过frm和idb恢复数据库的方法
  16. linux cp: 略过目录
  17. kubectl edit 与kubectl rollout
  18. 利用Anaconda Prompt在Jupter notebook中安装包
  19. 判断回文串,最长回文串方法
  20. 【系统分析师之路】第十六章 复盘计算机网络(新技术领域)

热门文章

  1. 动态规划_ 选出一些数相加,问最后是m的倍数的方案有多少种
  2. 角色扮演游戏引擎的设计原理--转自MOVE2008
  3. python 正无穷、负无穷的表示
  4. MySQL八股文背诵版
  5. ZYNQ 图像处理之千兆网传(一)【寄存器级操作】
  6. ICLR 2022杰出论文奖出炉!清华、人大获奖!浙大提名
  7. CentOS 7 安装 Postfix Dovecot
  8. 数据异动类问题分析-GMV下降
  9. scrapy简单爬取内容
  10. java软件工程师简历内容