照例化简题意:

给定一个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. VGG(2014),3x3卷积的胜利

    目录 写在前面 网络结构 multi-scale training and testing 其他有意思的点 参考 博客:blog.shinelee.me | 博客园 | CSDN 写在前面 VGG(2 ...

  2. HTML5 + WebGL 实现的垃圾分类系统

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

  3. 什么是回流(重排 reflow)?什么是重绘(repaint)?如何减少回流、重绘?

    什么是回流(重排 reflow)? 回流(重排 reflow):对DOM树进行渲染,只要修改DOM或修改元素的形状大小,就会触发reflow,reflow的时候,浏览器会使已渲染好受到影响的部分失效, ...

  4. Java求和的整体思路

    一.    设计思想: 设计这个程序我们需要考虑到参数的输入,并且可以输入多个参数,以及为用户考虑到各种的边界问题.首先第一步我们应该给出输入参数的语句,让用户可以输入.第二步我们应对其进行参数个数的 ...

  5. NAT模式实现虚拟机共享主机网络

    上一节我们在虚拟机上搭建了linux系统,并利用桥接模式访问互联网,这一节,我们来配置一下通过NAT模式访问互联网.说到这里有些小伙伴可能要问了,NAT模式和桥接模式有什么区别呢? 桥接模式: 虚拟机 ...

  6. Python函数参数与参数解构

    1 Python中的函数 函数,从数学的角度来讲是,输入一个参数,经过一个表达式的处理后得到一个结果的输出,即就是x-->y的一个映射.同样,在Python或者任何编程语言中,函数其实就是实现一 ...

  7. JNDI-Injection-Exploit

    介绍 最近把自己之前写的JNDI注入利用工具改了一下push到了github,地址:https://github.com/welk1n/JNDI-Injection-Exploit,启动后这个工具开启 ...

  8. VMware15.5版本下安装Windows_Server_2008_R2

    一.新建虚拟机 第一步:打开VMware15.5虚拟机,在欢迎界面点击新建虚拟机: 第二步:选择典型(推荐)选项-->适用于新手,单击下一步: 第三步:选定最后一项稍后安装操作系统,单击下一步: ...

  9. mycat+mysql搭建高可用集群1--垂直分库

    mycat垂直分库 本文主要介绍了如何使用mycat对mysql数据库进行垂直分库,包括: 垂直分库的步骤 垂直分库的环境准备 配置mycat垂直分库 1. 垂直分库的步骤 收集分析业务模块间的关系 ...

  10. opencv::Canny边缘检测

    Canny算法介绍 五步 in cv::Canny 高斯模糊 - GaussianBlur 灰度转换 - cvtColor 计算梯度 – Sobel/Scharr 非最大信号抑制 高低阈值输出二值图像 ...