照例化简题意:

给定一个01区间,可以把0改成1,问其中最长的01数量相等的区间长度。

额很容易想到前缀和,把w弄成1,h弄成-1,然后求前缀和,然后乱搞就行了。

但是一直不太会乱搞的我却直接想到了二分。

很容易很容易想到:答案有单调性,也就是:

答案肯定是单调不增的

怎么理解呢?

就是:一定存在一个区间长度,使得其-1不是最大,+1不存在,这就是我们要找的东西

而check的思路也就很明确了:

枚举左端点,然后根据二分出的mid(区间假定长度)来找到一个最长区间,然后判断其中白牛的数量是否为非负偶数:

如果白牛改的话,白-1,花+1,这样花牛的数量就比白牛多了2

若存在一个区间符合以上条件,就试着扩大区间(二分里l=mid),不符合就缩小区间,直到搜到答案。

需要注意的是:

如果搜到最后rx-lx达不到二分的区间长度,需要直接break掉,因为这里的答案不合法。

单次check的复杂度是O(n)的,因为lr端点都只遍历了一遍。

二分的复杂度是O(logn)

所以总复杂度就是O(n logn)

代码没什么大难度:

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e6+;
int n;
struct node
{
int x,co;
}a[maxn];
int sum[maxn];
int ans;
int f[maxn];
bool check(int x)
{
int r=;
for(int l=;l<=n;l++)
{
while(a[r].x-a[l].x<x&&r<n)r++;
if(a[r].x-a[l].x<x)break;
if((sum[r]-sum[l-])%==&&sum[r]-sum[l-]>=)return ;
}
return ;
}
bool cmp(node a,node b)
{
return a.x<b.x;
}
int main()
{
//freopen("testdata.in","r",stdin);
scanf("%d",&n);
for(int i=;i<=n;i++)
{
int x;
char f;
cin>>a[i].x>>f;
a[i].co=f=='W'? : -;
}
sort(a+,a+n+,cmp);
for(int i=;i<=n;i++)
sum[i]=sum[i-]+a[i].co;
int l=,r=;
while(l<r-)
{
int mid=l+r>>;
if(check(mid)==)
r=mid;
else
l=mid;
}
//while(check(l))l++;
printf("%d",l);
return ;
}

下面谈谈二分答案:

一般,二分答案常用于:

  1. 寻找某东西的最大最小值/最小最大值
  2. 有单调性的答案寻找

而我遇到的二分差不多有三种(主要是check类型):

  1. 跳石头类型(暴力判断)
  2. 本题(稍微转化下)
  3. 传送门(需要手推式子)

但是大体感觉都和跳石头差不多,找到条件,压掉一维O(n)的复杂度,使之变为log。

而二分很常用,很好用,要像想dp那样,经常想到。

下面介绍二分的板子(while内)

二分答案(正整数):

while(l<r-)
{
int mid=l+r>>;
if(check(mid)==)
r=mid;
else
l=mid;
}
while(check(l))l++;(因为输出左端点,而最后如果只更新了r,那么答案不一定正确,毕竟正整数的误差还是蛮大的)

实数域二分:

while((r-l)>0.000000001)
{
double mid=(l+r)/;
if(check(mid)==)
l=mid;
else
r=mid;
}只要精度不出锅应该都没问题

(完)

P3105 [USACO14OPEN]公平的摄影(正解是乱搞,我却二分了)(+二分答案总结)的更多相关文章

  1. P3105 [USACO14OPEN]公平的摄影Fair Photography

    题意翻译 在数轴上有 NNN 头牛,第 iii 头牛位于 xi(0≤xi≤109)x_i\:(0\le x_i\le 10^9)xi​(0≤xi​≤109) .没有两头牛位于同一位置. 有两种牛:白牛 ...

  2. luogu 2312 解方程 乱搞+取模

    思路非常好想,但是你很难想到去用这个算法,因为这个几乎就是个乱搞~ 我们发现多项式中每一个系数都很大,但是 $m$ 却很小,即最多只用 $10^6$ 个整数需要验证. 我们知道,如果一个数等于 $0$ ...

  3. HDU 4691 正解后缀数组(暴力也能过)

    本来是个后缀数组,考察算法的中级题目,暴力居然也可以水过,就看你跳不跳坑了(c++和G++返回结果就很不一样,关键看编译器) 丝毫不差的代码,就看运气如何了.唯一差别c++还是G++,但正解是后缀数组 ...

  4. 【BZOJ-4059】Non-boring sequences 线段树 + 扫描线 (正解暴力)

    4059: [Cerc2012]Non-boring sequences Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 440  Solved: 16 ...

  5. Linux 下 netbeans 字体抗锯齿正解

    转自:http://leenjewel.blog.163.com/blog/static/601937922010124444051/ 说来这个不难,主要是我看网上有的写的不是很明确,甚至有的写的根本 ...

  6. HDU 4251 --- 主席树(划分树是正解)

    题意:查询区间中位数 思路:模板题,相当于区间第K大的数,主席树可以水过,但划分树是正解.但还没搞明白划分树,先上模板 #include <iostream> #include <c ...

  7. Android事件模型之interceptTouchEvnet ,onTouchEvent关系正解

    首先,看Android的官方文档正解 onInterceptTouchEvent()与onTouchEvent()的机制: 1. down事件首先会传递到onInterceptTouchEvent() ...

  8. 分享网上搜到的Oracle中对判定条件where 1=1的正解

    今天在网上找到了Oracle中对判定条件where 1=1的正解,粘贴出来和大家分享下 1=1 是永恒成立的,意思无条件的,也就是说在SQL语句里有没有这个1=1都可以. 这个1=1常用于应用程序根据 ...

  9. Redis分布式锁实现方式(附有正解及错误示例)

    一.前言 本文内容主要来自博客:https://wudashan.com/2017/10/23/Redis-Distributed-Lock-Implement/,本文用于归纳总结及笔记用途,如有需要 ...

随机推荐

  1. .NET LINQ分析AWS ELB日志避免996

    前言 小明是个单纯的.NET开发,一天大哥叫住他,安排了一项任务: "小明,分析一下我们超牛逼网站上个月的所有AWS ELB流量日志,这些日志保存在AWS S3上,你分析下,看哪个API的响 ...

  2. Kubernetes之Pod介绍

    下图Pod的客户端有两类:其他Pod和集群外的客户端 集群外访问需要通过service提供固定端点访问 service的类型有:ClusterIP.NodePort.LoadBalancer.Exte ...

  3. django自关联,auth模块

    一.自关联 写蛮好的一篇博客:https://www.cnblogs.com/Kingfan1993/p/9936541.html 1.一对多关联 1.表内自关联是指表内数据相关联的对象和表是相同字段 ...

  4. cobalt strike批量发送钓鱼邮件

    0×01 利用Cobalt strike生成木马 这里我们生成木马可以用cs带的HTA.OFFICE宏.word宏来使目标上线cs,这里以word宏病毒为例子. 首先我们需要制作一个word宏病毒来进 ...

  5. 动画讲解TCP

    前言 TCP 三次握手过程对于面试是必考的一个,所以不但要掌握 TCP 整个握手的过程,其中有些小细节也更受到面试官的青睐. 对于这部分掌握以及 TCP 的四次挥手,小鹿将会以动画的形式呈现给每个人, ...

  6. 基于 HTML5 + WebGL 实现的垃圾分类系统

    前言 垃圾分类,一般是指按一定规定或标准将垃圾分类储存.分类投放和分类搬运,从而转变成公共资源的一系列活动的总称.分类的目的是提高垃圾的资源价值和经济价值,力争物尽其用.垃圾在分类储存阶段属于公众的私 ...

  7. Vue系列---源码构建过程(四)

    在了解源码如何构建之前,我们有必要了解下 项目中一个简单的目录结构如下: |---- vue | |---- dist # 打包后的存放文件目录 | |---- scripts # 存放构建相关的代码 ...

  8. The usage of Markdown---杂谈:缩进/换行/分割线/注释/文字颜色

    目录 1. 序言 2. 缩进 3. 换行 4. 分割线 5. 注释 6. 改变文字大小和颜色 更新时间:2019.09.14 1. 序言   今天一口气更新了接近10篇博客(虽然只是将我之前基本码好的 ...

  9. 不离开Emacs完成简单程序的编辑编译运行(windows或Linux)

    (1)打开Emacs (2)建立一个新的程序文件. 执行 C-x C-f, 然后在屏幕的底部出现minibuffer,光标提示你输入文件名称, 文件名称要带上后缀名,如hello.cpp.回车,然后开 ...

  10. rem1

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...