BZOJ 3540 realtime-update 解题
分析一下题意,大约是给定一串牛,然后找到一个跨越距离最长的牛子串使得在这个范围内白牛和花牛一样多. 白牛可以任意涂成花牛.
既然"白牛可以任意涂成花牛",那么我们需要找到一个最长的子串使得长度为偶且白牛数>=花牛.
注意这里的"最长"不指元素个数最多.
按照牛们排个序,那么就在一条线上了.
然后...细节明天想吧.
逗逼ZBT来更新啦!
有一种好猎奇的感觉呢!
用和临洮巨人一样的办法,用前缀和差优化那么
让我们(比如说)用
a[i]表示TOTAL{ select (* is white) in cow[0...i] }
b[i]表示TOTAL{ select (* is spotted) in cow[0...i] }
那么让我们用
c[i] = (foreach i in a,b[i]) a[i]-b[i]
这时一个符合条件的区间(r,l]即是
( odd(r) == odd(l) ) && c[l]-c[r]>=0 //P党很熟悉的odd函数,定义为 odd(i)=i&1
//为什么c[l]-c[r]>=0?
--------------------
c[l]-c[r] >= 0 ->
a[l]-b[l]-(a[r]-b[r]) = a[l]-b[l]-a[r]+b[r] = ( a[l]-a[r] ) - ( b[l]-b[r] )
也就是在这个范围内白牛比花牛多(由于是闭区间,省去了r-1的麻烦)
那么如何动态查找第一个c值小于当前结点的结点呢?
中国山东找蓝翔我们可以先记录下所有c值等于固定值中最小的那个,然后扫描一遍(同样是前缀和思想)可以实现c值小于等于这个的最小..然后再动态更新范围即可..
hash函数直接+=200000.
#include "cstdio"
#include "algorithm"
#include "cstring"
struct cow{
bool c;
int pos;
} cows[200000];
bool cmp(cow a,cow b){
return a.pos<b.pos;
}
inline int min(int a,int b){
return a<b?a:b;
}
int n,i,a,b,t,tt,maxs;
int f[500000];
char pt;
int main(int argc, char const *argv[]){
scanf("%d",&n);
for(i=1;i<=n;++i){
scanf("%d %c",&a,&pt);
cows[i].pos=a;
cows[i].c=(pt=='W');
}
std::sort(cows+1,cows+n+1,cmp);
memset(f,1,sizeof f);
a=200000;b=0;
f[200000]=0;
for(i=1;i<=n;++i){
if(cows[i].c) ++a; else ++b;
t=i&1,tt=a-b;
if(f[tt]>200000){
f[tt]=min(i,f[tt-2]);
}else{
f[tt]=min(f[tt],f[tt-2]);
}
if(cows[i].pos-cows[f[tt]+1].pos > maxs) maxs = cows[i].pos - cows[f[tt]+1].pos;
}
printf("%d\n", maxs);
return 0;
}
恩..两个点过不去..再说吧..
BZOJ 3540 realtime-update 解题的更多相关文章
- bzoj 3540: [Usaco2014 Open]Fair Photography
3540: [Usaco2014 Open]Fair Photography Description FJ's N cows (2 <= N <= 100,000) are standin ...
- BZOJ 2839: 集合计数 解题报告
BZOJ 2839: 集合计数 Description 一个有\(N\)个元素的集合有\(2^N\)个不同子集(包含空集),现在要在这\(2^N\)个集合中取出若干集合(至少一个),使得 它们的交集的 ...
- BZOJ 1367 [Baltic2004]sequence 解题报告
BZOJ 1367 [Baltic2004]sequence Description 给定一个序列\(t_1,t_2,\dots,t_N\),求一个递增序列\(z_1<z_2<\dots& ...
- bzoj 1700 Problem Solving 解题 dp
[Usaco2007 Jan]Problem Solving 解题 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 492 Solved: 288[Sub ...
- BZOJ 1044 木棍分割 解题报告(二分+DP)
来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...
- BZOJ 4619 Swap Space 解题报告
今天是因为David Lee正好讲这个题的类似题,我才做了一下. 本题是world final 2016的一道水…… 题目地址如下 http://www.lydsy.com/JudgeOnline/p ...
- BZOJ 4341 [CF253 Printer] 解题报告
乍一看这个题好像可以二分优先度搞搞... 实际上能不能这么搞呢...? 我反正不会... 于是开始讲我的乱搞算法: 首先肯定要把任务按照优先度排序. 用一棵在线建点的线段树维护一个时刻是否在工作. 然 ...
- BZOJ 4036 [HAOI2015] Set 解题报告
首先我们不能一位一位的考虑,为什么呢? 你想想,你如果一位一位地考虑的话,那么最后就只有 $n$ 个数字,然而他给了你 $2^n$ 个数字,怎么看都不对劲呀.(我是因为这样子弄没过样例才明白的) 所以 ...
- BZOJ 3288 Mato矩阵 解题报告
这个题好神呀..Orz taorunz 有一个结论,这个结论感觉很优美: $$ans = \prod_{i=1}^{n}\varphi(i)$$ 至于为什么呢,大概是这样子的: 对于每个数字 $x$, ...
随机推荐
- 年前辞职-WCF入门(6)
前言 昨天早上去医院做入职体检,被告知要预约,本以为是要排队,我连视频都准备好了...结果就回来了.下午去了新公司那边找房子,2了,因为公司提供了班车列表,我既然就只在班车所经过的几个地方找,却遗漏了 ...
- 第二十四课:jQuery.event.remove,dispatch的源码解读
本课还是来讲解一下jQuery是如何实现它的事件系统的.这一课我们先来讲一下jQuery.event.remove的源码解读. remove方法的目的是,根据用户传参,找到事件队列,从里面把匹配的ha ...
- AngularJS开发指南1:AngularJS简介
什么是 AngularJS? AngularJS 是一个为动态WEB应用设计的结构框架.它能让你使用HTML作为模板语言,通过扩展HTML的语法,让你能更清楚.简洁地构建你的应用组件.它的创新点在于, ...
- linux查看cpu、内存、版本信息
1. 查看物理CPU的个数#cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc –l 2. 查看逻辑CPU的个数#cat ...
- dell r710 服务器配置RAID5(3块硬盘做RAID5,另外再弄一块做数据冗余盘)
本文完全转载于:http://www.jb51.net/article/53814.htm,只为做笔记使用 ①4块硬盘做成RAID5 ②3块硬盘做RAID5,一块硬盘做热备盘 这两种配置之间的区别.大 ...
- OC基础--关键字@property 和 @synthesize
一.@property关键字需要掌握的知识: 1.用在@interface中,用来自动生成setter和getter的声明 例:@property int age;--相当于执行了右边的代码--> ...
- 【HDU 2222】Keywords Search AC自动机模板题
参考iwtwiioi的模板写出来的.上午gty讲的并没有听懂,只好自己慢慢对着模板理解. 在HDU上为什么相同的程序提交有时T有时A!!! 奉上sth神犇的模板(不是这道题): var ch:char ...
- Html-Css-div标签嵌套浮动div标签时无法撑开外部div的解决
当DIV1里面嵌套有一个DIV2,当DIV2设置了浮动,那么DIV1是无法被撑开的 当DIV1里面嵌套有一个DIV2,当DIV2设置了浮动,那么DIV1是无法被撑开的,也就是说DIV2在这里相当于浮在 ...
- nginx在linux中安装
下载地址:http://qkxue.net/ 1.2 解压 使用命令:tar zxvf nginx-1.8.1.tar.gz 1.3 切换至解压目录,安装依赖 yum -y install ...
- Spring AOP 系列总括
Spring有两大核心,IOC和AOP.IOC在Java Web项目中无时无刻不在使用,然而AOP用的比较少,尤其是对一些初级程序员,在架构师搭好的框架上开发应用代码,AOP几乎是透明的.然而,项目中 ...