当前位置: 首页 > news >正文

【51nod1472】取余最大值

Description

有一个长度为n的数组a,现在要找一个长度至少为2的子段,求出这一子段的和,然后减去最大值,然后对k取余结果为0。

问这样的子段有多少个。

样例解释:下标从1开始,对应的三个区间为[1:3],[1:4],[3:4]

Solution

其实就是求最大值与和同余的区间个数。
先找到每个最大值控制的区间,这个可以建出笛卡尔树然后遍历一遍求出。
考虑同余的条件,我们可以求一遍a的模k前缀和,那么对于区间\((l,r]\)且被当前最大值控制,那么有:\((s[j]-s[i])mod\ k=mx\),那么可以想到把关于\(i\)的移向一边,开个数据结构维护某个区间某个值出现了多少次。
还会有一个问题,跨越当前最大值的区间,左边和右边端点个数可能不平均,那么我们选择端点少的一边枚举,另一边直接用数据结构统计。复杂度最坏是两边平均,也就是\(O(nlog_2n)\),所以总复杂度是\(O(nlog_2^2n)\)的。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#define fo(i,j,k) for(int i=j;i<=k;++i)
#define fd(i,j,k) for(int i=j;i>=k;--i)
using namespace std;
typedef long long ll;
const int N=3e5+10;
int a[N],st[N],s[N],rs[N];
int le[N],re[N];
int bz[N<<2];
vector<int> b[N<<2];
void pre(int x){
    if(!x) return;
    pre(le[x]),le[x]=le[le[x]]?le[le[x]]:x;
    pre(re[x]),re[x]=re[re[x]]?re[re[x]]:x;
}
int find(int z,int l,int r){
    int l1=lower_bound(b[z].begin(),b[z].end(),l)-b[z].begin();
    int r1=upper_bound(b[z].begin(),b[z].end(),r)-b[z].begin()-1;
    return r1-l1+1;
}
int main()
{
    int n,k,top=0;
    scanf("%d %d",&n,&k);
    fo(i,1,n){
        scanf("%d",&a[i]),s[i]=(s[i-1]+a[i])%k;
        while(top && a[i]>a[st[top]]) top--;
        le[i]=re[st[top]],re[st[top]]=i;
        st[++top]=i;
    }
    re[0]=0;
    pre(st[1]);
    ll ans=0;
    fo(i,0,n) b[s[i]].push_back(i);
    fo(i,1,n)
    if(re[i]-i<i-le[i]){
        fo(j,i,re[i])
        ans+=find(((s[j]-a[i])%k+k)%k,le[i]-1,i-1);
    }
    else{
        fo(j,le[i],i)
        ans+=find((s[j-1]+a[i])%k,i,re[i]);
    }
    printf("%lld",ans-n);
}

转载于:https://www.cnblogs.com/sadstone/p/9209679.html

相关文章:

  • elasticsearch系列四:搜索详解(搜索API、Query DSL)
  • Oracle 安装报错 [INS-06101] IP address of localhost could not be determined 解决方法
  • OPENGL学习笔记整理(五):着色语言
  • Python3学习笔记16-错误和异常
  • 轻量级node-cache源码分析一波
  • 迭代器失效
  • OSChina 周六乱弹 —— 假如你被熊困到树上
  • 改变像素
  • Unix目录结构的来历
  • Localizing WPF with .resx files
  • 转载:进程上下文、中断上下文及原子上下文
  • fstream, operator, operator
  • 图像检索(2):均值聚类-构建BoF
  • 【Under-the-hood-ReactJS-Part0】React源码解读
  • c# is和as的区别
  • 【Amaple教程】5. 插件
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • Date型的使用
  • Java多态
  • Js基础知识(一) - 变量
  • python docx文档转html页面
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Redux系列x:源码分析
  • tensorflow学习笔记3——MNIST应用篇
  • Vue2.x学习三:事件处理生命周期钩子
  • 第2章 网络文档
  • 简单易用的leetcode开发测试工具(npm)
  • 前端技术周刊 2019-02-11 Serverless
  • 什么软件可以提取视频中的音频制作成手机铃声
  • 通过几道题目学习二叉搜索树
  • 选择阿里云数据库HBase版十大理由
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​人工智能书单(数学基础篇)
  • #1015 : KMP算法
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (2)关于RabbitMq 的 Topic Exchange 主题交换机
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (4)事件处理——(7)简单事件(Simple events)
  • (pt可视化)利用torch的make_grid进行张量可视化
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (ZT)北大教授朱青生给学生的一封信:大学,更是一个科学的保证
  • (超详细)语音信号处理之特征提取
  • (二)fiber的基本认识
  • (万字长文)Spring的核心知识尽揽其中
  • (一)python发送HTTP 请求的两种方式(get和post )
  • .equals()到底是什么意思?
  • .NET Framework 服务实现监控可观测性最佳实践
  • .NET MVC之AOP
  • .net 调用php,php 调用.net com组件 --
  • .Net6使用WebSocket与前端进行通信
  • .net和jar包windows服务部署
  • .NET序列化 serializable,反序列化
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @test注解_Spring 自定义注解你了解过吗?
  • [Android] 240204批量生成联系人,短信,通话记录的APK