题意翻译

在数轴上有 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. super(classname,self).__init__() 作用

  2. Oracle 11g Rac 用rman实现把本地数据文件迁移到ASM共享存储中

    在Oracle Rac环境中,数据文件都是要存放在ASM共享存储上的,这样两个节点才能同时访问.而当你在某一节点下把数据文件创建在本地磁盘的时候,那么在另一节点上要访问该数据文件的时候就会报错,因为找 ...

  3. Java 中的array数组总结之一

    数组:是一个将同种类型的数据存储在存储单元中. 可以用三种方式声明数组: 1.数据类型 标识符[]; int mothDays[]; 2.数据类型 标识符[] = new 数据类型[大小]; int ...

  4. Java IO写文件效率

    写入方法: /** *1 按字节写入 FileOutputStream * * @param count 写入循环次数 * @param str 写入字符串 */ public void output ...

  5. 小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式:

    小白学习VUE第一篇文章---如何看懂网上搜索到的VUE代码或文章---使用VUE的三种模式: 直接引用VUE; 将vue.js下载到本地后本目录下使用; 安装Node环境下使用; ant-desig ...

  6. 未能加载文件或程序集“Renci.SshNet, Version=2016.1.0.0, Culture=neutral, PublicKeyToken=……”

    emmmm~ 这是一个让人烦躁有悲伤的问题~ 背景 我也不知道什么原因,用着用着,正好好的,就突然报了这种问题~ 未能加载文件或程序集“Renci.SshNet, Version=2016.1.0.0 ...

  7. 作为Java开发人员不会饿死的5个理由

    尽管已有20多年的历史,Java仍然是最广泛使用的编程语言之一.只需看看统计数据:根据2018年Stack Overflow开发人员调查,Java是世界上第三大最受欢迎的技术. TIOBE指数,这是一 ...

  8. git的几个小技巧

    git的几个小技巧 分享git的几个小技巧,后面会根据使用补充.目前包括git撤销本地修改.git回退到前n个版本.git多用户提交冲突解决.git 命令简化.欢迎大家补充^_* 1.git撤销本地修 ...

  9. JDK13,不如温习下Java8

    JDK13于9月17号正式GA,版本新特性可参考: https://www.oschina.net/news/109934/jdk-13-released 虽然JDK更新迅速,但开发者貌似并不买账,据 ...

  10. 手把手教你用最简便的方法免费安装SSL

    原文链接:小枫同学的个人博客 随时IT的发展,它几乎涵盖了世界发展中的任何一方面,几乎都和计算机挂钩,也有好多小伙伴想开一个自己的网站,分享一些知识,分享一些心情等等.但是随着IT的发展,网络安全也越 ...