F - Yura and Developers

第一次知道单调栈搞出来的区间也能启发式合并。。。

你把它想想成一个树的形式, 可以发现确实可以启发式合并。

#include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define PII pair<int, int>
#define PLI pair<LL, int>
#define ull unsigned long long
using namespace std; const int N = 3e5 + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ;
const double eps = 1e-; int n, k, tot, a[N], stk[N], L[N], R[N], sum[N];
vector<int> num[]; void add(int &a, int b) {
a += b; if(a >= mod) a -= mod;
}
int cal(int x, int l, int r) {
auto it1 = upper_bound(num[x].begin(), num[x].end(), r);
auto it2 = lower_bound(num[x].begin(), num[x].end(), l);
return it1 - it2;
}
int main() {
scanf("%d%d", &n, &k);
num[].push_back();
for(int i = ; i <= n; i++) {
scanf("%d", &a[i]);
sum[i] = (sum[i-]+a[i]%k)%k;
num[sum[i]].push_back(i);
}
a[] = a[n+] = inf;
stk[++tot] = ;
for(int i = ; i <= n; i++) {
while(tot && a[stk[tot]] < a[i]) tot--;
L[i] = stk[tot];
stk[++tot] = i;
}
tot = ;
stk[++tot] = n+;
for(int i = n; i >= ; i--) {
while(tot && a[stk[tot]] <= a[i]) tot--;
R[i] = stk[tot];
stk[++tot] = i;
}
LL ans = ;
for(int i = ; i <= n; i++) {
if(i - L[i] < R[i] - i) {
for(int j = L[i]; j < i; j++)
ans += cal((sum[j]+a[i])%k, i, R[i]-);
} else {
for(int j = i; j < R[i]; j++) {
ans += cal((sum[j]-(a[i]%k)+k)%k, L[i], i-);
}
}
}
printf("%lld\n", ans - n);
return ;
} /*
*/

最新文章

  1. Netsuite &gt; Foreign Currency Revaluation 外币评估
  2. border边框的宽度/样式/颜色 全部值
  3. markdown编辑器使用建议
  4. 随笔3- list array
  5. Hbase0.98的环境搭建
  6. 剑指Offer:面试题4——替换空格(java实现)
  7. Server2003安装SP2补丁提示密钥无效的解决方法
  8. [反汇编练习] 160个CrackMe之016
  9. smarty 内置函数if 等判断
  10. js 检验密码强度
  11. Docker部署JavaWeb项目实战(转)
  12. ASP.NET Web API框架揭秘:路由系统的几个核心类型
  13. KERMIT,XMODEM,YMODEM,ZMODEM传输协议小结(转)
  14. Yii的HTML助手
  15. Flask 视图
  16. mysql 循环、游标
  17. 重建二叉树(JAVA)
  18. ros 查找包路径
  19. 深度分析:Android4.3下MMS发送到附件为音频文件(音频为系统内置音频)的彩信给自己,添加音频-发送彩信-接收彩信-下载音频附件-预览-播放(三,接收彩信&lt;2,下载彩信&gt;)
  20. js中哈希表的几种用法总结

热门文章

  1. 用rem做响应式开发
  2. 2017 清北济南考前刷题Day 1 morning
  3. Python学习笔记4-os,sys模块
  4. 奇葩字符 &quot;a๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎๎&quot; 的简单分析
  5. Python基础入门(一)
  6. ASP.NET mvc下在Controller下action的跳转方式
  7. C# 安装部署Windows服务脚本
  8. Linux 查看内存插槽数、最大容量的方法
  9. 一步一步搭建11gR2 rac+dg之配置单实例的DG(八)【转】
  10. Vue 3.0 的生命周期