当前位置: 首页 > news >正文

[USACO16FEB]负载平衡Load Balancing_Silver(NlogNlogN解法)

这道题其实有两个版本(usaco两个组)

较难版本的数据量应该是N<=1e5的

这意味着这道题一定有NlogN或时间复杂度接近的解法。

不难想到(模考的时候没想到),我们可以暴力枚举第一刀的情况然后二分第二刀的情况。因为如果只切一刀的时候,二分答案的正确性显然。那么我们切两刀的时候,枚举第一刀,然后第二刀就可以二分答案了。这就相当于一条扫描线。每向前推进一格,将这一条的所有点放入已扫描区域,从未扫描区域删除这些点。显然,我们可以用能维护区间的数据结构来实现。这里我选择了树状数组,读者也可以尝试用线段树。

第一次做的时候,认为要开一个二维树状数组,然后发现,只需要维护一维的就够了,因为我们二分的时候是在一维上二分的。这里可以离散化一下但是洛谷的数据太水了我懒得离散化(雾

代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 100001
int m;
int tree[2][N*10];
struct node
{
    int x,y;
}e[N];
inline void read(int &x)
{
    x=0;int f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    x*=f;
}
bool cmp(node p,node q)
{
    return p.x<q.x;
}
inline int lowbit(int i)
{
    return i&(-i);
}
void add(int t,int x,int w)
{
    while(x<=m)
    {
        tree[t][x]+=w;
        x+=lowbit(x);
    }
}
int query(int t,int x)
{
    int sum=0;
    while(x)
    {
        sum+=tree[t][x];
        x-=lowbit(x);
    }
    return sum;
}
int main()
{
    int n;
    read(n);
    for(int i=1;i<=n;++i)
    {
        read(e[i].x);
        read(e[i].y);
        m=max(m,e[i].y);    
    }
    for(int i=1;i<=n;++i) add(1,e[i].y,1);
    sort(e+1,e+n+1,cmp);
    int j;
    int ans=n;
    int l,r,mid,tmp;
    int sum0,sum1,tot0,tot1;
    for(int i=1;i<=n;i=j)
    {
        j=i;
        while(j<=n && e[j].x==e[i].x)
        {
            add(1,e[j].y,-1);
            add(0,e[j].y,1);
            j++;
        }
        l=1; r=m;
        tot0=query(0,m);
        tot1=query(1,m);
        tmp=1;
        while(l<=r)
        {
            mid=l+r>>1;
            sum0=query(0,mid);
            sum1=query(1,mid);
            if(max(sum0,sum1)>=max(tot0-sum0,tot1-sum1))
            {
                tmp=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        sum0=query(0,tmp);
        sum1=query(1,tmp);
        ans=min(ans,max(max(sum0,sum1),max(tot0-sum0,tot1-sum1)));
    }
    cout<<ans;
}
View Code

 

转载于:https://www.cnblogs.com/sherrlock/p/9812848.html

相关文章:

  • 在Ubuntu上学习OpenStack之五:控制节点上安装Nova
  • LintCode: coins in a line I
  • 推荐一款功能强大的Tomcat 管理监控工具,可替代Tomcat Manager
  • python web框架 MVC MTV
  • centos7--网易yum源
  • 数据库连接池和软件设计分层模式
  • 英语
  • 蓝牙的Baseband说明
  • 摩斯码编解码器
  • 四则运算“软件”之升级版
  • DOM & BOM
  • Javascript中局部变量和全局变量还有闭包的概念
  • 10.25 饮食
  • sticky
  • python面向对象的双下滑线方法
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • #Java异常处理
  • 【译】理解JavaScript:new 关键字
  • Apache Spark Streaming 使用实例
  • Cookie 在前端中的实践
  • HTTP中GET与POST的区别 99%的错误认识
  • idea + plantuml 画流程图
  • Java编程基础24——递归练习
  • JS笔记四:作用域、变量(函数)提升
  • JS字符串转数字方法总结
  • Linux Process Manage
  • Linux各目录及每个目录的详细介绍
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL-事务管理(基础)
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • python大佬养成计划----difflib模块
  • vuex 笔记整理
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 记一次和乔布斯合作最难忘的经历
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 深入浅出Node.js
  • 原生Ajax
  • scrapy中间件源码分析及常用中间件大全
  • ​人工智能书单(数学基础篇)
  • ​如何在iOS手机上查看应用日志
  • #define,static,const,三种常量的区别
  • #ubuntu# #git# repository git config --global --add safe.directory
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (23)Linux的软硬连接
  • (6)添加vue-cookie
  • (bean配置类的注解开发)学习Spring的第十三天
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (十六)串口UART
  • (转)ObjectiveC 深浅拷贝学习
  • (转)原始图像数据和PDF中的图像数据
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • ./mysql.server: 没有那个文件或目录_Linux下安装MySQL出现“ls: /var/lib/mysql/*.pid: 没有那个文件或目录”...