题目链接:http://arc075.contest.atcoder.jp/tasks/arc075_c

题意:问数组a有多少子区间平均值为k

题解:一开始考虑过dp,但是显然不可行,其实将每一个数都减去k就不用求平均值了,然后就是求满足前缀和sum[r]-sum[l-1]>=0,有多少组就行了。有点像逆序对。

用线段树即可。

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const int M = 2e5 + 10;
  8. struct TnT {
  9. int pos;
  10. ll val;
  11. }nn[M];
  12. struct node {
  13. int l , r;
  14. ll sum;
  15. }T[M << 2];
  16. bool cmp(TnT a , TnT b) {
  17. if(a.val == b.val) return a.pos < b.pos;
  18. return a.val < b.val;
  19. }
  20. void push_up(int i) {
  21. T[i].sum = T[i << 1].sum + T[(i << 1) | 1].sum;
  22. }
  23. void build(int i , int l , int r) {
  24. int mid = (l + r) >> 1;
  25. T[i].l = l , T[i].r = r , T[i].sum = 0;
  26. if(l == r) return ;
  27. build(i << 1 , l , mid);
  28. build((i << 1) | 1 , mid + 1 , r);
  29. push_up(i);
  30. }
  31. void update(int i , int pos) {
  32. int mid = (T[i].l + T[i].r) >> 1;
  33. if(T[i].l == pos && T[i].r == pos) {
  34. T[i].sum++;
  35. return ;
  36. }
  37. if(mid < pos) update((i << 1) | 1 , pos);
  38. else update(i << 1 , pos);
  39. push_up(i);
  40. }
  41. ll query(int i , int l , int r) {
  42. int mid = (T[i].l + T[i].r) >> 1;
  43. if(T[i].l == l && T[i].r == r) {
  44. return T[i].sum;
  45. }
  46. push_up(i);
  47. if(mid < l) return query((i << 1) | 1 , l , r);
  48. else if(mid >= r) return query(i << 1 , l , r);
  49. else {
  50. return query(i << 1 , l , mid) + query((i << 1) | 1 , mid + 1 , r);
  51. }
  52. }
  53. int main() {
  54. ll n , k , a;
  55. scanf("%lld%lld" , &n , &k);
  56. for(int i = 1 ; i <= n ; i++) {
  57. scanf("%lld" , &a);
  58. a -= k;
  59. nn[i].pos = i;
  60. nn[i].val = nn[i - 1].val + a;
  61. }
  62. sort(nn + 1 , nn + 1 + n , cmp);
  63. ll ans = 0;
  64. build(1 , 1 , (int)n);
  65. for(int i = 1 ; i <= n ; i++) {
  66. update(1 , nn[i].pos);
  67. if(nn[i].val >= 0) ans++;
  68. if(nn[i].pos - 1 == 0) continue;
  69. ans += query(1 , 1 , nn[i].pos - 1);
  70. }
  71. printf("%lld\n" , ans);
  72. return 0;
  73. }

Atcoder E - Meaningful Mean(线段树+思维)的更多相关文章

  1. 【插队问题-线段树-思维巧妙】【poj2828】Buy Tickets

    可耻的看了题解 巧妙的思维 逆序插入,pos 代表的意义为前面要有pos个空格才OK: 证明:仔细思考一下就觉得是正确的,但是要想到这种方式还是要很聪明,空格是前面的几个数字所形成的,所以要特地留出来 ...

  2. AtCoder AGC001F Wide Swap (线段树、拓扑排序)

    题目链接: https://atcoder.jp/contests/agc001/tasks/agc001_f 题解: 先变成排列的逆,要求\(1\)的位置最小,其次\(2\)的位置最小,依次排下去( ...

  3. BZOJ 4552(二分+线段树+思维)

    题面 传送门 分析 此题是道好题! 首先要跳出思维定势,不是去想如何用数据结构去直接维护排序过程,而是尝试二分a[p]的值 设二分a[p]的值为x 我们将大于x的数标记为1,小于等于x的数标记为0 则 ...

  4. Atcoder arc080E Young Maids(线段树+优先队列)

    给出一个n排列,每次可以选择相邻的两个数字放在新的排列首部,问最后形成的新的排列字典序最小是? 考虑新排列的第一个数字,则应是下标为奇数的最小数,下标不妨设为i.第二个数字应该下标大于i且为偶数的最小 ...

  5. hdu 4747 mex 线段树+思维

    http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意: 我们定义mex(l,r)表示一个序列a[l]....a[r]中没有出现过得最小的非负整数, 然后我 ...

  6. HDU - 6315 Naive Operations (线段树+思维) 2018 Multi-University Training Contest 2

    题意:数量为N的序列a和b,a初始全为0,b为给定的1-N的排列.有两种操作:1.将a序列区间[L,R]中的数全部+1:2.查询区间[L,R]中的 ∑⌊ai/bi⌋(向下取整) 分析:对于一个位置i, ...

  7. Uoj #218. 【UNR #1】火车管理 可持久化线段树+思维

    Code: #include<bits/stdc++.h> #define maxn 500005 using namespace std; int n,Q,ty,lastans=0; i ...

  8. codeforces 626 G. Raffles(线段树+思维+贪心)

    题目链接:http://codeforces.com/contest/626/problem/G 题解:这题很明显买彩票肯定要买贡献最大的也就是说买p[i]*(num[i]+1)/(num[i]+a[ ...

  9. 51nod 1376 最长递增子序列的数量(不是dp哦,线段树 +  思维)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1376 题解:显然这题暴力的方法很容易想到就是以每个数为结尾最 ...

随机推荐

  1. TCP拥塞算法瓶颈及TCP加速器解决方案

    TCP拥塞算法详解    ps:详解TCP拥塞算法就是为了说明瓶颈所在.   先解释一下概念: 拥塞:对网络中某一资源的需求超出了该资源所能提供的可用部分 拥塞窗口:以字节为单位,表示能通过的数据报的 ...

  2. ubuntu搭建环境

    1.终端输入 sudo apt- add-apt-repository ppa:ondrej/php  sudo add-apt-repository ppa:ondrej/php  sudo apt ...

  3. Linux进程间通信——信号

    一.认识信号 信号(Signals)是Unix.类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式.它是一种异步的通知机制,用来提醒进程一个事件已经发生.当一个信号发送给一个进程 ...

  4. codeforces 371 C-Hamburgers

    一个乱七八糟的故事背景,可以练练英语阅读. 大概的意思是Polycarpus喜欢汉堡,现在他有你ns片香肠片,nb面包,nc块起司,有r卢布,每种东西都有价格,如果不够他可以去商店买(商店里面各种东西 ...

  5. 邮件服务配置(虚拟域&虚拟用户)

    邮件服务配置(虚拟域&虚拟用户) 现在我做的是: Linux + httpd + php + mariadb + postfix + dovecot + phpMyAdmin + postfi ...

  6. Service 使用详解

    极力推荐文章:欢迎收藏 Android 干货分享 阅读五分钟,每日十点,和您一起终身学习,这里是程序员Android 本篇文章主要介绍 Android 开发中的部分知识点,通过阅读本篇文章,您将收获以 ...

  7. 算法与数据结构基础 - 字典树(Trie)

    Trie基础 Trie字典树又叫前缀树(prefix tree),用以较快速地进行单词或前缀查询,Trie节点结构如下: //208. Implement Trie (Prefix Tree)clas ...

  8. Opengl_入门学习分享和记录_00

    2019.7.4 本着对游戏创作的热情,本人初步了解了一部分的unity引擎的使用,也学习了一点C#可是越学习unity我就反而对引擎内部感兴趣(不知道有没有一样的朋友=,=). 接着了解到了open ...

  9. XML学习(二)

    1.上期回忆 XML基础 1)XML的作用 1.1 作为软件配置文件 1.2 作为小型的"数据库" 2)XML语法(由w3c组织规定的) 标签: 标签名不能以数字开头,中间不能有空 ...

  10. Jenkins持续集成项目搭建——基于Python Selenium自动化测试

    参考链接:https://www.liaoxuefeng.com/article/1083282007018592 第一步:去官网https://jenkins.io/下载最新的war包 第二步:安装 ...