Yura and Developers

题目大意

给出一个长度为n的区间,求其中有多少个区间,使得这个区间中所有元素的和减去这个区间中的最大值除以k的余数为0.

代码

#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int maxn = 3 * 1e5 + 10;
const int maxm = 1e6 + 10;
const int INF = 1e9 + 7;
int a[maxn], pre[maxn], lsum[maxm], rsum[maxm], lpoi, rpoi, k, mx, ans, n;
void devide(int l, int r){int mid = (l + r) / 2;if(l == r)return;devide(l, mid);devide(mid + 1, r);lpoi = mid;rpoi = mid + 1;mx = 0;while(lpoi >= l){//固定最大值在左边while(a[rpoi] <= a[lpoi] && rpoi <= r){rsum[(k + (pre[rpoi] - pre[mid]) % k) % k] ++;rpoi ++;}   while((a[lpoi] < a[rpoi] || rpoi > r) && lpoi >= l){mx = max(a[lpoi], mx);ans += rsum[(k - (pre[mid] - pre[lpoi - 1] - mx) % k) % k];lpoi --;}}for(int i = mid + 1; i <= r; i ++){rsum[(k + (pre[i] - pre[mid]) % k) % k] = 0;}lpoi = mid;rpoi = mid + 1;mx = 0;while(rpoi <= r){//固定最大值在右边while(a[lpoi] < a[rpoi] && lpoi >= l){lsum[(k + (pre[mid] - pre[lpoi - 1]) % k) % k] ++;lpoi --;}   while((a[rpoi] <= a[lpoi] || lpoi < l) && rpoi <= r){mx = max(a[rpoi], mx);ans += lsum[(k - (pre[rpoi] - pre[mid] - mx) % k) % k];rpoi ++;}}for(int i = l; i <= mid; i ++)lsum[(k + (pre[mid] - pre[i - 1]) % k) % k] = 0;
main(){while(scanf("%I64d %I64d", &n, &k) == 2 && n){pre[0] = 0;for(int i = 1; i <= n; i ++){scanf("%I64d", &a[i]);pre[i] = (pre[i - 1] + a[i]) % k;//pre数组为前缀和}ans = 0;devide(1, n);//分治printf("%I64d\n", ans);}return 0;
}       

Yura and Developers相关推荐

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

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

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

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

  3. Codeforces - Yura and Developers

    题目链接:Codeforces - Yura and Developers 有一个显然的2个log做法. 分治最大值,然后枚举小区间启发式计算答案. 但是其实可以一个log,因为分治的时候,对于区间形 ...

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

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

  5. Codeforces 549F Yura and Developers

    Description 有一个长度为n的数组a,现在要找一个长度至少为2的子段,求出这一子段的和,然后减去最大值,然后对k取余结果为0. 问这样的子段有多少个 题面 Solution 考虑分治,普遍的 ...

  6. [分治] 51Nod1472 Codeforces #549F. Yura and Developers

    分治学傻的我只会无脑分治-- 题意就是求满足 sum≡maxsum \equiv max 的区间.反正就是按套路搞. 注意计数的数组不能每次 clearclear ,要开时间戳. #include&l ...

  7. [CF549F/51nod1472]Yura and Developers

    题目大意 有一个长度为n的数组a,现在要找一个长度至少为2的子段,求出这一子段的和,然后减去最大值,然后对k取余结果为0. 问这样的子段有多少个. 数据范围 1 ≤ n ≤ 300 000, 1 ≤  ...

  8. ●CodeForces 549F Yura and Developers

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

  9. 【Codeforces 549F】Yura and Developers | 单调栈、启发式合并、二分

    题目链接:https://codeforces.com/problemset/problem/549/F 题目大意: 给定一个序列和一个mod值,定义[l,r]合法当l到r的所有元素和减去其中的最大值 ...

最新文章

  1. php.ini安全配置详细解释
  2. 输入检测的诡异问题--firefox和ie的兼容性
  3. python模块xlwt怎么用不了_python中使用 xlwt 操作excel的常见方法与问题
  4. 机械硬盘 mysql调优_【MYSQL】使用RAID增加传统机器硬盘的性能
  5. 前端学习(2592):当前用户显示
  6. 强化学习算法在京东广告序列推荐场景的应用实践
  7. java xml 解析 列表_用Java解析高级XML
  8. Oracle中拼出树型结构
  9. Python语言应该加上块标识(开始、结束)的特性
  10. 当纺织遇上阿里云,数学博士钻进车间要让企业更高效
  11. windows7文本文档换成c语言,win10电脑新建文本文档默认编码是UTF-8怎么修改成ANSI编码...
  12. 云课堂智慧职教中c语言答案,云课堂智慧职教查答案自动答题
  13. 服务器端移动端车牌识别sdk
  14. STM8S003F3 内部时钟初始化以及定时器做延时的使用
  15. 谷歌2018年IO大会
  16. python游走代码_用Python模拟随机游走(Random walks)
  17. Oracle 中递归查询
  18. 微信小程序流量主开通 (如何赚钱)
  19. 2021年的诀尘子和Vue
  20. git免密pull指定ssh密钥文件

热门文章

  1. hdu1114 Piggy-Bank
  2. 跑鸭”微信小程序-一款基于校园跑步的社交小程序
  3. 十大免费设计资源网站(素材,图库,字体,图标,flash)
  4. 点击tab栏如何让tab置顶
  5. python双星号什么运算_**(双星号/星号)和*(星号/星号)对参数有什么作用?...
  6. ES时间查询报错 - “caused_by“:{“type“:“illegal_argument_exception“,“reason“:“failed to parse date field
  7. java马赛克_java实现图片缩放、旋转和马赛克化
  8. 天猫登录 post java_天猫登录POST问题
  9. 红外接收器的外围电路设计(方法+使用手册指引)
  10. 用行列式展开计算n阶行列式【c++/递归】