题意翻译

在数轴上有 NNN 头牛,第 iii 头牛位于 xi(0≤xi≤109)x_i\:(0\le x_i\le 10^9)xi​(0≤xi​≤109) 。没有两头牛位于同一位置。
有两种牛:白牛和花斑牛。保证至少有一头白牛。你可以把白牛涂成花斑牛,不限数量,不限哪只。
找一段尽量长的区间,使得区间的两端点均有一头牛,且区间中白牛与花斑牛的数量相等。试求区间长度。

感谢 @Planet6174 的翻译

题目描述

FJ's N cows (2 <= N <= 100,000) are standing at various
positions along a long one-dimensional fence. The ith cow is standing at
position x_i (an integer in the range 0...1,000,000,000) and is either a
plain white cow or a spotted cow. No two cows occupy the same position,
and there is at least one white cow.

FJ wants to take a photo of a contiguous interval of cows for the
county fair, but in fairness to his different cows, he wants to ensure
there are equal numbers of white and spotted cows in the photo. FJ wants
to determine the maximum size of such a fair photo, where the size of a
photo is the difference between the maximum and minimum positions of
the cows in the photo.

To give himself an even better chance of taking a larger photo, FJ
has with him a bucket of paint that he can use to paint spots on an
arbitrary subset of his white cows of his choosing, effectively turning
them into spotted cows. Please determine the largest size of a fair
photo FJ can take, given that FJ has the option of painting some of his
white cows (of course, he does not need to paint any of the white cows
if he decides this is better).

输入输出格式

输入格式:

* Line 1: The integer N.

* Lines 2..1+N: Line i+1 contains x_i and either W (for a white cow) or S (for a spotted cow).

输出格式:

* Line 1: The maximum size of a fair photo FJ can take, after possibly painting some of his white cows to make them spotted.

输入输出样例

输入样例#1:
复制

5
8 W
11 S
3 W
10 W
5 S
输出样例#1: 复制

7

说明

There are 5 cows. One of them is a white cow at position 8, and so on.

FJ takes a photo of the cows from positions 3 to positions 10. There are 4 cows in this range -- 3 white and 1 spotted -- so he needs to paint one of the white cows to make it spotted.

题解:

  发现这个题目本质上是找一个区间,使得(白牛的数量-花牛的数量)%2==0,所以想到前缀和,记sum1为白牛的前缀和,sum2为花牛的前缀和。区间i,j合法只有区间设k=(sum1[i]-sum1[j-1])-(sum2[j-1]-sum2[j-1])。必须k>=0且k%2==0,给式子变一下形,就是k=sum1[i]-sum2[i]-(sum2[j-1]-sum1[j-1])。分类讨论sum1[i]-sum2[i]的奇偶性质,把sum2[j-1]-sum1[j-1]丢到两棵线段树里,维护sum2[j-1]-sum1[j-1]的最大值就可以判断区间何不合法,因为要枚举右端点,时间复杂度nlogn.

代码:

  

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <iostream>
#define MAXN 104000
#define ll long long
#define RG register
using namespace std; struct tree{
int l,r,maxx;
}a[][MAXN*]; struct cow{
int pl,co;
void read(){
char x;
scanf("%d%c%c",&pl,&x,&x);
if(x=='W') co=;
else co=;
}
}b[MAXN]; int sum1[MAXN],sum2[MAXN];
int n; inline bool cmp(cow x,cow y){
if(x.pl<y.pl) return ;
return ;
} int check(int x){
if(abs(x)%==) return ;
else return ;
} int query(int xv,int l,int r,int id,int x){
int L=a[id][xv].l,R=a[id][xv].r,mid=(L+R)/;
if(L==R) return L;
if(a[id][xv*].maxx+x>=) return query(xv*,l,mid,id,x);
else if(a[id][xv*+].maxx+x>=) return query(xv*+,mid+,r,id,x);
else return ;
} void insert(int xv,int ps,int zhi,int id){
int l=a[id][xv].l,r=a[id][xv].r,mid=(l+r)/;
if(l==r){
a[id][xv].maxx=zhi;
return;
}
if(ps<=mid) insert(xv*,ps,zhi,id);
else insert(xv*+,ps,zhi,id);
a[id][xv].maxx=max(a[id][xv*].maxx,a[id][xv*+].maxx);
} void work(){
int ans=;
for(int i=;i<=n;i++){
int hh=sum1[i]-sum2[i],l=;int id=check(hh);
if((sum1[i]-sum2[i]+sum2[]-sum1[])%==&&sum1[i]-sum2[i]+sum2[]-sum1[]>=)
ans=max(ans,b[i].pl-b[].pl);
if(hh+a[id][].maxx>=)
l=query(,,i,id,hh);
if(l)
ans=max(ans,b[i].pl-b[l+].pl);
hh=sum2[i]-sum1[i];id=check(hh);
insert(,i,sum2[i]-sum1[i],id);
}
printf("%d",ans);
} void build(int id,int l,int r){
if(l==r){
a[][id].l=a[][id].l=l,a[][id].r=a[][id].r=r;
a[][id].maxx=a[][id].maxx=-(<<);
return;
}
a[][id].maxx=a[][id].maxx=-(<<);
a[][id].l=a[][id].l=l,a[][id].r=a[][id].r=r;
int mid=(l+r)/;
build(id*,l,mid),build(id*+,mid+,r);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++) b[i].read();
sort(b+,b+n+,cmp);
for(int i=;i<=n;i++) if(b[i].co==) sum1[i]=sum1[i-]+,sum2[i]=sum2[i-]; else sum2[i]=sum2[i-]+,sum1[i]=sum1[i-];
build(,,n);
work();
return ;
}

P3105 [USACO14OPEN]公平的摄影Fair Photography的更多相关文章

  1. P3105 [USACO14OPEN]公平的摄影(正解是乱搞,我却二分了)(+二分答案总结)

    照例化简题意: 给定一个01区间,可以把0改成1,问其中最长的01数量相等的区间长度. 额很容易想到前缀和,把w弄成1,h弄成-1,然后求前缀和,然后乱搞就行了. 但是一直不太会乱搞的我却直接想到了二 ...

  2. BZOJ3540: [Usaco2014 Open]Fair Photography

    3540: [Usaco2014 Open]Fair Photography Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 72  Solved: 29 ...

  3. RabbitMQ简单应用の公平分发(fair dipatch)

    公平分发(fair dipatch)和轮询分发其实基本一致,只是每次分发的机制变了,由原来的平均分配到现在每次只处理一条消息 1.MQ连接工厂类Connection package com.mmr.r ...

  4. bzoj 3540: [Usaco2014 Open]Fair Photography

    3540: [Usaco2014 Open]Fair Photography Description FJ's N cows (2 <= N <= 100,000) are standin ...

  5. [BZOJ3535][Usaco2014 Open]Fair Photography

    [BZOJ3535][Usaco2014 Open]Fair Photography 试题描述 FJ's N cows (1 <= N <= 100,000) are standing a ...

  6. RabbitMQ学习第二记:工作队列的两种分发方式,轮询分发(Round-robin)和 公平分发(Fair dispatch)

    1.什么是RabbitMQ工作队列 我们在应用程序使用消息系统时,一般情况下生产者往队列里插入数据时速度是比较快的,但是消费者消费数据往往涉及到一些业务逻辑处理导致速度跟不上生产者生产数据.因此如果一 ...

  7. 解题:USACO14OPEN Fair Photography

    题面 有点像JRY的那道序列题,大概是统计题的经典套路? 先说无修改的:将白奶牛记为$-1$,花奶牛记为$1$,然后做前缀和统计某个前缀和$sum$第一次出现的位置,之后再出现就统计答案.对于修改(将 ...

  8. Fair Photography

    题目大意: 给出直线上N个点的位置和颜色(0或1),求最大的区间,使得区间内0的个数大于等于1的个数且0的个数减去1的个数为偶数. 解题过程: 1.先贴个lsdsjy大牛的线段树的做法:http:// ...

  9. [Usaco2014 Open]Gold Fair Photography(hash)

    最近做了usaco2014 open的金组,果然美帝的题还是没有太简单啊QAQ,被每年的月赛骗了QAQ 不过话说官方题解真心棒(虽然英文的啃得好艰难,我英语渣你们别鄙视我= =),标程超级优美QAQ ...

随机推荐

  1. eclipse中离线安装activit插件

    离线安装activiti教程: 1.先下载压缩包和jar包 链接:https://pan.baidu.com/s/1hSToZt_4A262rUxc8KToCw 密码:j5r1 2.将下载好的jars ...

  2. 进击的 Java ,云原生时代的蜕变

    作者| 易立 阿里云资深技术专家 导读:云原生时代的来临,与Java 开发者到底有什么联系?有人说,云原生压根不是为了 Java 存在的.然而,本文的作者却认为云原生时代,Java 依然可以胜任&qu ...

  3. Flume介绍与安装

    搭建环境 部署节点操作系统为CentOS,防火墙和SElinux禁用,创建了一个shiyanlou用户并在系统根目录下创建/app目录,用于存放 Hadoop等组件运行包.因为该目录用于安装hadoo ...

  4. iOS -打包上传成功,在"构建版本"一直刷不出来

    今天提交版本到appstore,构建版本一直不出来,等了一天也没有出来,其实就是权限问题,iOS13 来了,所以面临的问题随之而来,苹果给邮箱发了这段话: Dear Developer,We iden ...

  5. OPC-System.Runtime.InteropServices.COMException:“Error HRESULT E_FAIL has been returned from a call to a COM component.”

    Error HRESULT E_FAIL has been returned from a call to a COM component的错误提示,还是因为OPC配置,这次是红框中标签定义错误,应该 ...

  6. 基于SpringBoot实现AOP+jdk/CGlib动态代理详解

    动态代理是一种设计模式.在Spring中,有俩种方式可以实现动态代理--JDK动态代理和CGLIB动态代理. JDK动态代理 首先定义一个人的接口: public interface Person { ...

  7. [转载 ]五种常见的 PHP 设计模式

    五种常见的 PHP 设计模式 策略模式 策略模式是对象的行为模式,用意是对一组算法的封装.动态的选择需要的算法并使用. 策略模式指的是程序中涉及决策控制的一种模式.策略模式功能非常强大,因为这个设计模 ...

  8. 用Python帮你实现IP子网计算

    目录 0. 前言 1. ipaddress模块介绍 1.1 IP主机地址 1.2 定义网络 1.3 主机接口 1.4 检查address/network/interface对象 1.4.1 检查IP版 ...

  9. Oracle 查询真实执行计划

    什么是真实执行计划 获取Oracle的执行计划,有几种方式.(本文使用Oracle 11g XE版本,以及普通用户scott登录) explain plan for 有两个步骤: explain pl ...

  10. html实现打印预览效果

    前面说到利用lodop插件进行打印设置,那个应用于打印快递面单,或者跟快递面单相似场景的情况. 今天的利用html快速打印出A4纸大小的场景,例如:合同.静态文本等. 效果如下: 方式一 1.设置di ...