TOJ 6121: 学长的情书 ( 二分)
传送门:
6121: 学长的情书 
总提交: 79 测试通过:2
描述
抹布收到了一封情书,但是这封情书上只有一串数字,发信人多半是将想要表达的意思隐藏在这串数字里,但是直男抹布怎么看得出来呢。抹布对着这串数字百思不得其解,十分苦恼,当然了,一味的苦恼不是抹布的性格,他决定苦中作乐,他想知道,这串数字中有多少组"优美子序列"。他定义,如果某个连续 的子序列中恰好包含k个偶数数字,就称这个序列为"优美子序列"。
现在你看到抹布竟然对着这样一封有着特殊含义的情书玩起了毫不相干的游戏,你看不下去了,你决定...帮助他解出这个问题。
输入
输入数据多组,以EOF结束。
每组数据第一行,包含两个正整数n,k,表示n个数字,k的含义与描述中相同。(1<=n<=10^5,0<=k<=5*10^4)
接下来一行,包含n个正整数m,每个数字之间用一个空格隔开。(1<=m<=10^5)
数据组数小于110组。
输出
对于每组输入,输出优美子序列的组数,占一行。
样例输入
5 3
2 2 1 2 2
样例输出
2
提示
【样例说明】恰好包含3个偶数的连续子序列只有2个,分别是[2,2,1,2],[2,1,2,2]。
【数据范围】
对于45%的数据,1<=n<=10^3,0<=k<=10^3。
对于90%的数据,1<=n<=10^4,0<=k<=10^4。
对于100%的数据,1<=n<=10^5,0<=k<=5*10^4。
吐槽:
看到2KMS,想了个nlogn的二分去大力莽了。。
思路:
老年人做法
预处理偶数的前缀和。
比如说
样例 2 2 1 2 2
前缀和sum数组是1 2 2 3 4
对每个位置pos,对前缀和数组的操作是对pos之后的位置进行二分查找到sum[pos-1]+k,第一个等于这个数位置posLeft和最后一个等于这个数的位置posRight
差值就是当前位置对答案的贡献:ans += posRight-posLeft+1
trick:
1、当K等于0时候,如果二分写的不好要过滤一下(二分写的好的话可能不用?存疑)
2、ans要用long long
复杂度O(nlogn)
应该有双指针的贡献算法更快(待补)
代码:
#include"bits/stdc++.h"
using namespace std;
typedef long long LL;
int a[],k,n;
int sum[];
int SolveLeft(int begin){
int l = begin,r = n;
int key = sum[begin-] + k;
int ans = ;
while(l <= r){
int mid = (l+r) >> ;
if(sum[mid] >= key){
r = mid-;
ans = mid;
}else{
l = mid+;
}
}
return ans;
}
int SolveRight(int begin){
int l = begin,r = n;
int key = sum[begin-] + k;
int ans = ;
while(l <= r){
int mid = (l+r) >> ;
if(sum[mid] > key){
r = mid-;
}else{
l = mid+;
ans = mid;
}
}
return ans;
} int main(){
while(~scanf("%d%d",&n,&k)){
LL ans = ;
sum[] = ;
for(int i = ; i <= n ; i ++){
scanf("%d",a+i);
a[i] = (a[i]&) ? :;
sum[i] = ;
}
for(int i = ; i <= n ; i ++){
sum[i] = sum[i-]+a[i];
}
for(int i = ; i <= n ; i ++){
int L = SolveLeft(i);
int R = SolveRight(i);
if(R < i) continue; //当K等于0的时候会过滤掉误加
if(L != ){
ans += (R-L+1L);
}
}
cout<<ans<<endl;
}
}
/*
5 3
2 2 1 2 2 6 3
2 2 1 2 1 2 5 0
1 0 1 0 1 5 1
2 2 1 2 2 10 0
1 1 0 1 0 1 1 1 0 0 2 1
1 0 2 0
1 0
*/
TOJ 6121: 学长的情书 ( 二分)的更多相关文章
- 【TOJ 3369】CD(二分)
描述 Jack and Jill have decided to sell some of their Compact Discs, while they still have some value. ...
- Luogu P1638 逛画展 【二分答案】
题目描述 博览馆正在展出由世上最佳的 M 位画家所画的图画. wangjy想到博览馆去看这几位大师的作品. 可是,那里的博览馆有一个很奇怪的规定,就是在购买门票时必须说明两个数字, a和b,代表他要看 ...
- NOIP系列
NOIP2015运输计划 唉 真是 这题 卡死我了 tarjan离线lca复杂度O(n) 最后各种卡常,多交几遍才A(洛谷104ms) %%%zk学长609ms 注意二分的时候左边界要定成0 根据题意 ...
- 4.28(TG模拟赛)总结
1.挖地雷 题目背景 NOIp1996提高组第三题 题目描述 在一个地图上有N个地窖(N≤20),每个地窖中埋有一定数量的地雷.同时,给出地窖之间的连接路径.当地窖及其连接的数据给出之后,某人可以从任 ...
- TOJ 3750: 二分查找
3750: 二分查找 Time Limit(Common/Java):3000MS/9000MS Memory Limit:65536KByteTotal Submit: 1925 ...
- toj 4353 Estimation(树状数组+二分查找)
Estimation 时间限制(普通/Java):5000MS/15000MS 运行内存限制:65536KByte总提交: 6 测试通过: 1 描述 “There are ...
- BZOJ 1044 木棍分割 解题报告(二分+DP)
来到机房刷了一道水(bian’tai)题.题目思想非常简单易懂(我的做法实际上参考了Evensgn 范学长,在此多谢范学长了) 题目摆上: 1044: [HAOI2008]木棍分割 Time Limi ...
- BZOJ-1196 公路修建问题 最小生成树Kruskal+(二分??)
题目中一句话,最大费用最小,这么明显的二分的提示(by 以前morestep学长的经验传授)...但完全没二分,1A后感觉很虚.. 1196: [HNOI2006]公路修建问题 Time Limit: ...
- BZOJ-1189 紧急疏散evacuate BFS预处理+最大流+二分判定+神建模!!
绝世污题,垃圾题,浪费我一整天青春! 1189: [HNOI2007]紧急疏散evacuate Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1262 ...
随机推荐
- JavaReflection(转载)
平时看代码时,总是碰到这些即熟悉又陌生的名次,每天都与他们相见,但见面后又似曾没有任何的交集,所以今天我就来认识下这两个江湖侠客的背景: CLASS 在Java中,每个class都有一个相应的Clas ...
- fedora 安装 pidgin-lwqq
因为 腾讯自带的linux for qq 已经无法登陆,于是详尽各种办法在fedora 上安装 qq ,但均以失败高中.于是使用了几天web qq 但最终无法忍受,于是有研究起来了 pidgin-l ...
- MaxCompute问答整理之6月
本文是基于本人对MaxCompute产品的学习进度,再结合开发者社区里面的一些问题,进而整理成文.希望对大家有所帮助,下面咱们正式开始. 1.什么是MaxCompute呢?MaxCompute是由阿里 ...
- 三.使用JDBC处理MySql大数据
一.基本概念 大数据也称之为LOB(Large Objects),LOB又分为:clob和blob,clob用于存储大文本,blob用于存储二进制数据,例如图像.声音.二进制文等. 在实际开发中,有时 ...
- docker search
命令:docker search [root@iZ943kh74qgZ ~]# docker search --help Usage: docker search [OPTIONS] TERM Sea ...
- Unity3D 物体旋转之Quaternion.Slerp
实现的功能:1个物体以一定的速度转向目标物体 Quaternion TargetRotation = Quaternion.LookRotation(m_Target.transform.positi ...
- Ubuntu 如何编译安装第三方库
在工程应用中都会用到第三方库,标准库是在我们安装IDE环境或系统自带已经编译好的库,我们是可以直接调用的,而第三方库需要我们自己下载,编译和安装后才能使用,这里我们说的是Ubuntu如何使用cmake ...
- Java面向对象----封装概念
封装 信息隐藏,隐藏对象的细节 访问修饰符 public private protected 默认 属性封装的实现 方法封装的目的(隐藏方法实现细节) package com.tanlei.newer ...
- Alternating Direction Method of Multipliers -- ADMM
前言: Alternating Direction Method of Multipliers(ADMM)算法并不是一个很新的算法,他只是整合许多不少经典优化思路,然后结合现代统计学习所遇到的问题,提 ...
- gcc需找头文件路径
`gcc -print-prog-name=cc1plus` -v This command asks gcc which C++ preprocessor it is using, and then ...