Portal --> broken qwq

Description

​   给你一个长度为\(n\)的序列\(a\)和一个正整数\(k\),求满足如下条件的区间\([l,r]\)的数量:\((\sum\limits_{i=l}^r a[i]-max(l,r))\%k=0\),其中\(max\)表示的是该区间的最大值

   数据范围:\(,n<=300000,k<=100000\),保证答案\(<=10^9\)

Solution

​   啊所以说是。。想不到怎么做就想分治吗qwq

​   我们首先可以考虑一种最简单粗暴的求解方式:我们固定一个左端点和最大值,然后看右端点能够移到哪里,然后统计其贡献,快速得出一个区间的表达式值是比较方便的,只要直接维护一个前缀和\(sum\),\(sum[r]-sum[l-1]-mx\)就是表达式的值了

​   然后怎么优化的话。。就是可以将这个思路用到分治里面去

​   对于当前的区间\([l,r]\),我们考虑左端点在\([l,mid]\),右端点在\([mid+1,r]\)中的满足条件的区间, 具体的计算有点迷,考虑将这堆区间再按照最大值的位置分成两类,一类是最大值在\(mid\)及以前,一类是最大值在\(mid\)以后,这两类的计算方式类似,接下来以第一类为例说一下大致过程:一开始将左端点设在\(mid\)处,将右端点设在\(mid+1\)处,每次将左端点往左移一位,然后更新当前位置到\(mid\)这段的最大值作为整个区间的最大值,然后暴力将右端点往右移,这里我们需要一个计数数组来统计贡献,考虑到我们要算的是\(sum[r]-sum[l-1]-mx\equiv 0(mod\ k)\)的区间,而当前\(l\)和\(mx\)是固定的,所以我们可以将右端点的贡献记在计数数组中\(sum[r]\%k\)的位置,调用的时候直接调\((sum[l-1]+mx)\%k\)位置的值就是贡献了

​   如果说是统计第二类的话,就是变成将贡献记在\(sum[l-1]\%k\)的位置上,调用的时候是\((sum[l-1]-mx)\%k\)位置的值即可

​   最后是。。记得清空

   还有就是相同的情况只能算到一边去,也就是其中一类在移的时候是\(<=mx\),另一类是\(<mx\),否则的话会算重

  

   代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=300010;
int a[N],sum[N],cnt[N];
int n,m,ans;
void solve(int l,int r){
if (l==r) return;
int mid=l+r>>1,tpl,tpr,mx;
tpl=mid; tpr=mid+1; mx=0;
while (tpl>=l){
mx=max(mx,a[tpl]);
while (tpr<=r&&mx>=a[tpr])
++cnt[sum[tpr]],++tpr;
ans+=cnt[(sum[tpl-1]+mx)%m];
--tpl;
}
for (int i=mid+1;i<=r;++i) cnt[sum[i]]=0;
tpl=mid; tpr=mid+1; mx=0;
while (tpr<=r){
mx=max(mx,a[tpr]);
while (tpl>=l&&mx>a[tpl])
++cnt[sum[tpl-1]],--tpl;
ans+=cnt[(m-mx%m+sum[tpr])%m];
++tpr;
}
for (int i=l;i<=mid;++i) cnt[sum[i-1]]=0;
solve(l,mid);
solve(mid+1,r);
} int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d%d",&n,&m);
sum[0]=0;
for (int i=1;i<=n;++i) scanf("%d",a+i),sum[i]=(sum[i-1]+a[i])%m;
solve(1,n);
printf("%d\n",ans);
}

Yura的更多相关文章

  1. Looksery Cup 2015 F - Yura and Developers 单调栈+启发式合并

    F - Yura and Developers 第一次知道单调栈搞出来的区间也能启发式合并... 你把它想想成一个树的形式, 可以发现确实可以启发式合并. #include<bits/stdc+ ...

  2. codeforces 549F Yura and Developers(分治、启发式合并)

    codeforces 549F Yura and Developers 题意 给定一个数组,问有多少区间满足:去掉最大值之后,和是k的倍数. 题解 分治,对于一个区间,找出最大值之后,分成两个区间. ...

  3. 【Codeforces549F】Yura and Developers [单调栈][二分]

    Yura and Developers Time Limit: 20 Sec  Memory Limit: 512 MB Description Input Output Sample Input 4 ...

  4. Codeforces 549F Yura and Developers

    probelm 题意 给定一个序列和一个mod值,定义[l,r]合法当l到r的全部元素和减去当中的最大值的结果能够整除mod.问共同拥有多少区间合法. 思路 一開始想的分治. 对于一个[l,r]我们能 ...

  5. ●CodeForces 549F Yura and Developers

    题链: http://codeforces.com/problemset/problem/549/F题解: 分治,链表. 考虑对于一个区间[L,R],其最大值在p位置, 那么答案的贡献就可以分为3部分 ...

  6. Swing做的非阻塞式仿飞秋聊天程序

    采用Swing 布局 NIO非阻塞式仿飞秋聊天程序, 切换皮肤颜色什么的小功能以后慢慢做 启动主程序. 当用户打开主程序后自动获取局域网段IP可以在 设置 --> IP网段过滤, 拥有 JMF ...

  7. 从零开始学习jQuery (九) jQuery工具函数

    一.摘要 本系列文章将带您进入jQuery的精彩世界, 其中有很多作者具体的使用经验和解决方案,  即使你会使用jQuery也能在阅读中发现些许秘籍. 我们经常要使用脚本处理各种业务逻辑, 最常见的就 ...

  8. 【原创】Android 对话框的使用

    对话框即Dialog .google的官方解释:A dialog is usually a small window that appears in front of the current Acti ...

  9. Yandex 2013Q(Atoms: There and Back Again-贪心+模拟+List)

    Atoms: There and Back Again Time limit 2 seconds Memory limit 256Mb Input stdin Output stdout Legend ...

随机推荐

  1. 003--MySQL 数据库事务

    什么是事务? 事务是一组原子性的 SQL 查询, 或者说是一个独立的工作单元. 在事务内的语句, 要么全部执行成功, 要么全部执行失败. 事务的 ACID 性质 数据库事务拥有以下四个特性, 即 AC ...

  2. QSS 样式示例:QTreeWidget, QComboBox,QSlider,QSpinBox

    目录 Image 填充整个控件的区域 QTreeWidget QSpinbox 的上翻下翻按钮和箭头 QComboBox 的设置,大坑 QSlider 最近需要对一个软件加上Qt界面和 的样式,第一次 ...

  3. (转)一篇写的简明易懂的logging模块

    转:http://kenby.iteye.com/blog/1162698 一.从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 创 ...

  4. text-align与vertical-align属性的区别

    1.text-align属性设置元素在水平方向(x轴)的位置 text-align:left://文本居左 text-align:center://文本居中 text-align:right: //文 ...

  5. RIGHT-BICEP测试第二次

    1.Right-结果是否正确? 正确 2.B-是否所有的边界条件都是正确的? 正确 3.P-是否满足性能要求? 部分满足 4.是否满足有无括号? 无 5.数字个数是否不超过十? 只是双目运算 6.能否 ...

  6. 利用p4实现ipv6转发实验

    写在前面 只是作为一个入门p4的实验尝试,借用了一些即成的运行代码. p4代码 /**p4_16,v1_model**/ #include<core.p4> #include<v1m ...

  7. 严重: Failed to destroy end point associated with ProtocolHandler ["http-nio-8080"] java.lang.NullPointer

    刚接触servlet类,按照课本的方法使用eclipse新建了一个servlet类. 新建完成后,在web.xml里面进行注册 这时候就会报错了. 五月 07, 2016 11:23:28 上午 or ...

  8. C++ Primer Plus学习:第四章

    C++入门第四章:复合类型 1 数组 数组(array)是一种数据格式,能够存储多个同类型的值. 使用数组前,首先要声明.声明包括三个方面: 存储每个元素中值的类型 数组名 数组中的元素个数 声明的通 ...

  9. Spark Transformations介绍

    背景 本文介绍是基于Spark 1.3源码 如何创建RDD? RDD可以从普通数组创建出来,也可以从文件系统或者HDFS中的文件创建出来. 举例:从普通数组创建RDD,里面包含了1到9这9个数字,它们 ...

  10. (转)关于ActiveMQ的配置

    目前常用的消息队列组建无非就是MSMQ和ActiveMQ,至于他们的异同,这里不想做过多的比较.简单来说,MSMQ内置于微软操作系统之中,在部署上包含一个隐性条件:Server需要是微软操作系统.(对 ...