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 ...
随机推荐
- HDU 1028 Ignatius and the Princess III (递归,dp)
以下引用部分全都来自:http://blog.csdn.net/ice_crazy/article/details/7478802 Ice—Crazy的专栏 分析: HDU 1028 摘: 本题的意 ...
- c#知识库同步的总结
C#知识库下载地址: http://www.51aspx.com/Code/FileCollector 新版下载地址:http://pan.baidu.com/s/1P3Hk 对于这一款平时用来收集知 ...
- github and SourceTree初步使用
1.建立连接(一次就行了) 输入你的github名字 2.创建仓库 3.下载仓库 这个时候打开SouceTree就可以看到之前创的仓库了 点击克隆,创建一个文件夹,讲路径设置好 这时候查看本地列表就会 ...
- UVA 562 Dividing coins
题目描述:给出一些不同面值的硬币,每个硬币只有一个.将这些硬币分成两堆,并且两堆硬币的面值和尽可能接近. 分析:将所有能够取到的面值数标记出来,然后选择最接近sum/2的两个面值 状态表示:d[j]表 ...
- PHP5.4最新特性
PHP5.4最新特性 官网:ChangeLog-5.php#5.4.0 原文Oracle:LAMP 体系有了新的竞争,但此版本中的特性使 PHP 再次挑战极限. 稍微做了修改.: 概述总结:1. ...
- win7桌面便签。自带的
新建WIN7下的桌面便签小程序 桌面—>新建 快捷方式-> 输入%windir%\system32\StikyNot.exe
- 23种设计模式学习一(单列模式)singleton
单列模式的类(单线程下的) class Singleton { private static Singleton instance; private Singleton() { } public st ...
- 矩阵快速幂 POJ 3735 Training little cats
题目传送门 /* 题意:k次操作,g:i猫+1, e:i猫eat,s:swap 矩阵快速幂:写个转置矩阵,将k次操作写在第0行,定义A = {1,0, 0, 0...}除了第一个外其他是猫的初始值 自 ...
- 【转】java线程系列---Runnable和Thread的区别
在java中可有两种方式实现多线程,一种是继承Thread类,一种是实现Runnable接口:Thread类是在java.lang包中定义的.一个类只要继承了Thread类同时覆写了本类中的run() ...
- JSP下载txt 和 Excel两种文件
JSP下载txt 和 Excel两种文件 jsp 下载txt文件和excel文件 jsp 下载txt文件和excel文件 最近做了个用jsp下载的页面 将代码贴出来 权作记录吧 1 下载txt文件 ...