【暴力Treap 或 离线归并】子串计数(genies)
子串计数(genies)
Description
给出一段含有n个元素的序列a,要求求出子串和小于等于t的子串个数
Input Data
输入共两行
第一行包含两个整数,n,t分别表示序列a元素的个数和限制t
第二行包含n个数表示元素a_iOutput Data
共一行,含一个数
表示子串和小于等于t的子串个数。Input / Output Sample
input #1: 5 4
5 -1 3 4 -1 output #1:
7
Solution:
一道妙题,首先分析性质。如果从L+1到R可以构成一个合法的区级显然s[R]-S[L]<=t,且L<=R;
前缀和的想法是显然的,但是还是突破不了枚举子串的瓶颈。
假设当前枚举到第i个元素那么我要从s[0]-s[i-1]找到尽可能多的s[j] (j∈[0,i-1])使s[i]-s[j]<=t,不妨考虑移项
s[j]>=s[i]-t,而此时s[i]-t是定值!!!我们只需要统计前面的s[j]有多少个s[j]>=s[i]-t就行了!即求s[i]-t的排行rank,
n-rank就是答案!
然而这种方法不是很妙,更妙的方法是这样的:
首先我们知道归并排序只会把他分成越分越小,而不会改变他原序列的前后顺序。
对于每一次归并的[L,T]和[T+1,R],在每一段都是升序排序的,我们弄一个指针pt1指在[L,T]弄另外的指针pt2指在[T+1,R]
对于s[pt1]不断的把pt2往右移动,找到第一个不能满足s[pt2]-s[pt1]<=t的点(前面可以满足的记录)。这样可以保证处理2段区间的复杂度是O(n)的
对于全部的数据复杂度显然是O(n log n)的。
Code:
# include <bits/stdc++.h>
# define int long long
using namespace std;
const int N=;
int n;
int t,ans=;
int s[N];
void solve(int l,int r)
{
if (l>=r) return;
int mid=(l+r)>>;
solve(l,mid); solve(mid+,r);
int ret=;
for (int i=l,j=mid;i<=mid;i++) {
while (j<r&&s[j+]-s[i]<=t) j++;
ret+=j-mid;
}
ans+=ret;
inplace_merge(s+l,s+mid+,s+r+);
}
signed main()
{
scanf("%lld%lld",&n,&t);
for (int i=;i<=n;i++) {
int x; scanf("%lld",&x);
s[i]=s[i-]+x;
}
solve(,n);
printf("%lld\n",ans);
return ;
}
【暴力Treap 或 离线归并】子串计数(genies)的更多相关文章
- vijosP1567子串计数
描述现在有一个字符串,请求出这个字符串不相同的子串个数.YXY现在不会做,请你来帮忙…… n<=20W 题解: 后缀数组裸题,其实我在练习模板写对了没 代码: #include<cstdi ...
- 【poj3415-Common Substrings】sam子串计数
题意: 给出两个串,问这两个串的所有的子串中(重复出现的,只要是位置不同就算两个子串),长度大于等于k的公共子串有多少个. 题解: 这题好像大神们都用后缀数组做..然而我在sam的题表上看到这题,做 ...
- [bzoj3277==bzoj3473]出现k次子串计数——广义后缀自动机+STL
Brief Description 给定n个字符串,对于每个字符串,您需要求出在所有字符串中出现次数大于等于k次的子串个数. Algorithm Design 先建立一个广义后缀自动机,什么是广义后缀 ...
- hdu_2328_Corporate Identity(暴力枚举子串+KMP)
题目链接:hdu_2328_Corporate Identity 题意: 给你n个串,让你找这n个串的最大公共子串 题解: 串比较小,暴力枚举第一个的子串,然后KMP判断是否可行 #include&l ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- BZOJ4032 : [HEOI2015]最短不公共子串
第一问: 对B串建立SAM,暴力枚举A的每个子串,在SAM上走,若失配则可行. 第二问: 设g[i][j]表示B串的第i个字符之后最早出现的字符j的位置,暴力枚举A的每个子串,按照g贪心地走,若失配则 ...
- Leetcode_5.最长回文子串
最长回文子串 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab& ...
- 转载:LeetCode:5Longest Palindromic Substring 最长回文子串
本文转自:http://www.cnblogs.com/TenosDoIt/p/3675788.html 题目链接 Given a string S, find the longest palindr ...
- 2020-03-25:快排、堆排和归并都是O(nlog n)的算法,为何JDK选择快速排序?
福哥答案2020-03-26: 口诀如下:冒选插希快 堆归计桶基(冒泡,选择,插入,希尔,快速,堆,归并,计数,桶,基数)冒线 平平 稳常小选平 平平 不常小插线 平平 稳常序希线 四组 不常组快四 ...
随机推荐
- MIPI Alliance (MIPI联盟)
一.介绍 1.MIPI联盟,即移动产业处理器接口(Mobile Industry Processor Interface 简称MIPI)联盟.MIPI(移动产业处理器接口)是MIPI联盟发起的为移动应 ...
- 约束布局constraint-layout导入失败的解决方案 - 转
今天有同事用到了约束布局,但是导入我的工程出现错误 **提示错误: Could not find com.Android.support.constraint:constraint-layout:1. ...
- C# 文本转语音朗读
1. 利用DONET框架自带的 SpeechSynthesizer ,缺点是没有感情色彩,抑扬顿挫等. using System; using System.Collections.Generic; ...
- 记录一次 @Autowired 无法注入( spring依赖正常 idea显示有spring已注入的图标)导致空指针异常的原因
首先,参考 https://blog.csdn.net/weixin_40475523/article/details/81085990 然后发现 是因为我把自己的这个类加上了 @Service 注解 ...
- More Effective C++ Item14:明智运用exception specifications
使用exception specifications你必须非常仔细去确保,函数调用的子函数.注册的回调函数不会违背约定.而设计模板内部的异常更难确保. 设计回调机制的时候,如果调用方规定了不抛出异常, ...
- 博客目录 Blog directory
Linux 学习笔记 Linux/Mac 挂载远程服务器目录到本地 --Mount remote server directory to local PC 远程连接服务器端Jupyter Notebo ...
- proe工程图输出dwg/dxf文件设置
网上看到不少人分享proe转转dxf/dwg配置文件的,但是看了一圈,几乎都没有涉及到转化线型的,所以自己整理自己的配置文件,写在这里分享出来. 以Pro/engineer WF5.0为例: 1.复制 ...
- 一种C#泛型方法在lua中表示的设计
在进行lua方法注册的时候, 大多数解决方案直接否定了泛型方法, 因为在lua侧难以表达出泛型, 以及lua的函数重载问题, 函数重载问题可以通过一些特殊方法解决, 而泛型问题是主要问题, 以Unit ...
- ELK日志方案--使用Filebeat收集日志并输出到Kafka
1,Filebeat简介 Filebeat是一个使用Go语言实现的轻量型日志采集器.在微服务体系中他与微服务部署在一起收集微服务产生的日志并推送到ELK. 在我们的架构设计中Kafka负责微服务和EL ...
- 【文章存档】如何通过 GitLab 进行持续部署
好久没写博客了,这几天存档一下新文章. 链接 https://docs.azure.cn/zh-cn/articles/azure-operations-guide/app-service-web/a ...