USACO 2014 Open Silver Fairphoto
这道题只是银牌组的第一题而我就写了 3K 的代码。唉。
Description - 问题描述
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).
在X的非负轴上有N个不在同一位置上的数,0或1.至少有1个0.
可以先任意把0变成1.
区间长度定义为,[L,R]中最右和最左的数的差的绝对值.
求一个最长区间,满足区间中所有数0和1的个数相同.
输出这个最长区间的长度.
Solution - 解题报告
首先,我的第一反应是用线段树维护几个字段来搞,但是想想感觉不太可行。
然后从前缀和的角度分析一下题目,用 a(i) 表示 1...i 中 0 的个数,用 b(i) 表示 1...i 中 1 的个数,则符合条件的区间 [L, R] 可以表示为
a(R)-a(L-1)>=b(R)-b(L-1) 且 (a(R)-a(L-1))-(b(R)-b(L-1)) mod 2=0
解释一下:因为我们可以把任意的 0 变成 1,那么当且仅当区间中 0 的个数不少于 1,而且 0 与 1 的个数相差为偶数时区间可以变为一个合法区间。
把上面的第一个式子变形一下就是:
a(R)-b(R)>=a(L-1)-b(L-1)
那么我们就维护每个位置的 val = a(i)-b(i),那么只要比较两个位置的 val 值大小就能确定这两个位置之间的区间是否满足第一个条件。
具体做法依然是用线段树:
将数据按位置排序后,从右往左扫描,把信息插入到线段树中。
线段树的端点值代表的是 val = a(i)-b(i) 的值,而线段树中的每个结点 [a, b] 维护的信息 max_pos 代表「val 值大于等于 a 小于等于 b 的所有位置中的最靠右的位置」。
这样描述太抽象,举个栗子:
假如线段树中某个叶节点为 [a, a],它维护的 max_pos 值是 5,那就意味着,在所有的 val 值等于 a 的位置中,5 是最靠右的那个位置。这里有一点点贪心的想法:如果有多个位置都能与当前位置构成一个合法区间,我们当然应该选择最靠右的那个位置来构成一个最长的区间。
那么从右往左扫描的时候,如果当前位置 i 的 val = x,那么我们就在线段树里查询 [x, n] 中的 max_pos,设其为 j,那么区间 [i+1, j] 就是一个合法的区间,而且是以 i 开头的最长的区间。然后我们再把该位置的 val 值连同位置信息插入到线段树中。(注意我们是从右往左扫,那么我们从线段树中得到的 j 必然是大于 i 的)(这个想法得益于之前向 LZW 大神请教的一道题)
但是别忘了我们还有第二个条件:(a(R)-a(L-1))-(b(R)-b(L-1)) mod 2=0
其实要满足这个条件是很简单的:分奇偶性讨论。
也就是说我们把 val 值为奇数的单独建一棵线段树,val 值为偶数的另外单独建一棵线段树,根据当前位置 i 的 val 值的奇偶性来决定在哪棵树里查询。
还有一个注意点就是别忘了在线段树中插入位置 0 处的信息。因为上面我们对于位置 i 得到的区间是 [i+1, j],那么以第一个位置开头的区间并没有被我们得到。所以还要插入位置 0。
至此问题解决。复杂度 O(NlogN)。
而官方题解用的是一种我看不懂的算法(orz)。下面介绍另外一种 O(N) 神算法,来自http://www.cnblogs.com/zyfzyf/p/4006874.html:
我们先不考虑事先把 0 修改成 1。
首先,我们把 0 看做 -1,然后做前缀和 s(i)。
那么一个满足条件的区间 [L, R] 必然有 s(R)=s(L-1)。
然后我们用一个数组 first[x] 记录前缀和为 x 的最左边的位置。然后从左到右扫一遍。
如果考虑修改,那么满足条件的区间有 s(R)-s(L-1)<=0 且 s(R)-s(L-1) mod 2=0,表现在对于某个位置 i,first[s(i)],first[s(i)+2],first[s(i)+4],... 都能与 i 构成合法的区间。那么在扫描的时候就改变一下 first[x] 的含义:
for(int i=*n;i>=;i--)
first[i]=min(first[i+], first[i]);
(注意,因为前缀和可能小于 0 但不可能小于 -n,所以在保存到 first 数组的时候加上一个偏移量 n,那么 first 数组的下标范围就是 0...2n)
代码量 1K。蒟蒻表示五体投地 orz。
USACO 2014 Open Silver Fairphoto的更多相关文章
- [9018_1592]USACO 2014 Open Silver Fairphoto
题目描述 Farmer John's N cows (1 <= N <= 100,000) are standing at various positions along a long o ...
- USACO翻译:USACO 2014 DEC Silver三题
USACO 2014 DEC SILVER 一.题目概览 中文题目名称 回程 马拉松 奶牛慢跑 英文题目名称 piggyback marathon cowjog 可执行文件名 piggyback ma ...
- USACO翻译:USACO 2014 FEB SILVER 三题
USACO 2014 FEB SILVER 一.题目概览 中文题目名称 自动打字 路障 神秘代码 英文题目名称 auto rblock scode 可执行文件名 auto rblock scode 输 ...
- USACO翻译:USACO 2014 MARCH Silver三题
USACO 2014 MARCH 一.题目概览 中文题目名称 农田灌溉 懒牛 牛叫 英文题目名称 irrigation lazy mooomoo 可执行文件名 irrigation lazy mooo ...
- USACO翻译:USACO 2014 US Open 三题
USACO 2014 US Open 一.题目概览 中文题目名称 牧场装饰 里程表 牛像展览 英文题目名称 decorate odometer fairphoto 可执行文件名 decorate od ...
- USACO翻译:USACO 2014 JAN三题(2)
USACO 2014 JAN 一.题目概览 中文题目名称 队伍平衡 滑雪录像 滑雪场建设 英文题目名称 bteams recording skicourse 可执行文件名 bteams recordi ...
- USACO翻译:USACO 2014 JAN三题(1)
USACO 2014 JAN 一.题目概览 中文题目名称 滑雪场设计 滑雪降速 滑雪场评级 英文题目名称 skidesign slowdown skilevel 可执行文件名 skidesign sl ...
- USACO翻译:USACO 2013 NOV Silver三题
USACO 2013 NOV SILVER 一.题目概览 中文题目名称 未有的奶牛 拥挤的奶牛 弹簧牛 英文题目名称 nocow crowded pogocow 可执行文件名 nocow crowde ...
- USACO翻译:USACO 2013 DEC Silver三题
USACO 2013 DEC SILVER 一.题目概览 中文题目名称 挤奶调度 农场航线 贝西洗牌 英文题目名称 msched vacation shuffle 可执行文件名 msched vaca ...
随机推荐
- 虚拟专用网络VPN
寒假回到家里需要下载论文,怎样才能访问学校图书馆的数据库呢?解决方法是学校图书馆在内网中架设一台VPN服务器,VPN服务器有两块网卡,一块连接内网,一块连接公网.然后就可以通过互联网找到VPN服务器, ...
- java集合之ArrayList的实现原理
1. ArrayList概述: ArrayList是List接口的可变数组的实现.实现了所有可选列表操作,并允许包括 null 在内的所有元素.除了实现 List 接口外,此类还提供一些方法来操作内部 ...
- Android开发者应该深入学习的10个开源应用项目
Android 开发带来新一轮热潮让很多移动开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的 智慧和创造力.学习开源代码是掌握技术的 ...
- 知问前端——概述及jQuery UI
知问系统,是一个问答系统.主要功能:即会员提出问题,会员回答问题.目前比较热门的此类网站有:知乎http://www.zhihu.com.百度知道http://zhidao.baidu.com等.这里 ...
- linux系统下挂载windows共享目录
在工作中有时我们需要在linux上挂载windows共享目录.首先我们需要学会在linux上查看windows共享了那些目录.查看操作需要安装samba-client. [root@ ~]# yum ...
- 10 signs you’re dating the wrong person
10 signs you’re dating the wrong person10个迹象表明TA不是你的真心人 Do you have any exes who were so awful ...
- Why you have so few friends?
Why you have so few friends?十个原因告诉你:为什么你的朋友那么少1. You Complain A Lot 你总是抱怨 If you’re constantly compl ...
- Ibm-jQuery教程学习笔记
一.概述 1.虽然 jQuery 本身并非一门新的语言.但是,学习其语法有助于我们熟练.灵活地使用它.回顾下我们熟悉的 CSS 语法,不难发现 jQuery 的语法与 CSS 有相似之处. jQuer ...
- My SQL InnoDB 1217 - Cannot delete or update a parent row:aforeign key constraint fals
InnoDB 允许有外键 MyISAM 不允许有外键 InnoDB修改成MyISAM 证明有外键 一张表如果有其他表的外键关联的是它 它也不能是MyISAM 来自为知笔记(Wiz)
- ITEM 2 MAC OSX 功能略强大的终端
iTerm2 iTerm 2 is a terminal emulator for Mac OS X that does amazing things. iTerm2 是一个终端模拟器,官方网站:ht ...