牛客小白月赛17 G 区间求和

时间:2022-09-07 08:13:28

传送门

题意:

牛客小白月赛17 G 区间求和

题解:

原本想着使用暴力方法:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<map>
6 using namespace std;
7 typedef long long ll;
8 const int maxn=1e5+5;
9 const int mod=26;
10 int v[maxn],w[maxn];
11 int main()
12 {
13 int n,m;
14 scanf("%d%d",&n,&m);
15 for(int i=1;i<=n;++i)
16 {
17 scanf("%d",&v[i]);
18 //sum[i]=sum[i-1]+v[i];
19 }
20 while(m--)
21 {
22 int l,r,ans=0;
23 memset(w,0,sizeof(w));
24 scanf("%d%d",&l,&r);
25 for(int i=l;i<=r;++i)
26 {
27 ans=ans+w[v[i]]*v[i];
28 w[v[i]]++;
29 ans=ans+w[v[i]]*v[i];
30 }
31 printf("%d\n",ans);
32 }
33 return 0;
34 }

但是对每一次的询问都对应一次区间[l,r]的遍历,最大复杂度就是1e5*1e5(还以为数据会水过)

这个时候就要使用莫队算法(优雅的暴力)来解决了

莫队算法就是先分块,再所有询问的区间按某种方式进行排序,一个一个区间的找结果。具体看代码

以多少分一块看具体情况,这个不固定

代码:

 1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<map>
6 using namespace std;
7 typedef long long ll;
8 const int maxn=1e5+5;
9 const int mod=26;
10 const int block=300;
11 ll w[maxn],ans,v[maxn],sum[maxn];
12 struct shudui
13 {
14 ll l,r,id;
15 bool operator<(const shudui x)const //<号代表从大到小排序
16 {
17 if(l/block==x.l/block)
18 return r<x.r;
19 else return l/block<x.l/block;
20 }
21 }m[maxn];
22 ll n,k;
23 void add(ll i)
24 {
25 ans=ans+w[v[i]]*v[i]; //w存这个数字出现的次数
26 w[v[i]]++;
27 ans=ans+w[v[i]]*v[i]; //如果一个数字出先2次,那么可以第一次遇见它只加上它
28 } //再一次遇见再加一次。比如3出现2次
29 void del(ll i) //第一次ans=3
30 {
31 ans=ans-w[v[i]]*v[i]; //第二次ans+3+w[3]*3 ==3*2+3*2(最后的结果)
32 w[v[i]]--;
33 ans=ans-(w[v[i]]*v[i]);
34 }
35 int main()
36 {
37 scanf("%lld%lld",&n,&k);
38 for(ll i=1;i<=n;++i)
39 {
40 scanf("%lld",&v[i]);
41 }
42 for(ll i=1;i<=k;++i)
43 {
44 scanf("%lld%lld",&m[i].l,&m[i].r);
45 m[i].id=i;
46 }
47 sort(m+1,m+1+k);
48 ll l=0,r=0;
49 ans=0;
50 for(ll i=1;i<=k;++i)
51 {
52 while(l<m[i].l)
53 del(l),l++;
54 while(l>m[i].l)
55 add(--l);
56 while(r>m[i].r)
57 del(r),r--;
58 while(r<m[i].r)
59 add(++r);
60 sum[m[i].id]=ans;
61 }
62 for(ll i=1;i<=k;++i)
63 {
64 printf("%lld\n",sum[i]);
65 }
66 return 0;
67 }

牛客小白月赛17 G 区间求和的更多相关文章

  1. 牛客网 牛客小白月赛5 I&period;区间 &lpar;interval&rpar;-线段树 or 差分数组?

    牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...

  2. 牛客小白月赛5 I - 区间

    看到一份不错的操作..... 链接:https://www.nowcoder.com/acm/contest/135/I 来源:牛客网 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a, ...

  3. 牛客小白月赛2 G 文 【模拟】

    链接:https://www.nowcoder.com/acm/contest/86/G来源:牛客网 题目描述 Sεlιнα(Selina) 开始了新一轮的男友海选.她要求她的男友要德智体美劳样样都全 ...

  4. 牛客小白月赛6 G 指纹锁 set的自动排序 模板

    链接:https://www.nowcoder.com/acm/contest/136/G来源:牛客网 题目描述     HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁.   ...

  5. 牛客网 牛客小白月赛2 G&period;文

    G.文 链接:https://www.nowcoder.com/acm/contest/86/G 这个题wa了一发,有点智障,浮点数,式子里面要*1.0,忘了,然后wa了,改了就过了(脑子有坑) 代码 ...

  6. 牛客小白月赛17 A 小sun的假期

    传送门 题意: 第一行两个数n,m,代表总共有n天,m个安排.接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了.安排可能会重复. 小 sun 非常喜欢放假,尤其是那种连在一起 ...

  7. 牛客小白月赛1 G&Tab;あなたの蛙は旅⽴っています【DP】

    题目链接 https://www.nowcoder.com/acm/contest/85/G 思路 按照题解上的方式 存取数据 然后DP一下 就可以了 AC代码 #include <cstdio ...

  8. 牛客小白月赛5 I 区间 &lpar;interval&rpar; 【前缀和】

    链接:https://www.nowcoder.com/acm/contest/135/I 题目描述 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次 ...

  9. 牛客小白月赛1 G&Tab;あなたの蛙は旅⽴っています【图存储】【DP】

    题目链接:https://www.nowcoder.com/acm/contest/85/G 思路: DP 空间可以优化成一维的, 用一维数组的 0 号单元保存左斜对角的值即可. 存图这里真不好理解 ...

随机推荐

  1. css3中变形函数(同样是对元素来说的)和元素通过改变自身属性达到动画效果

    /*对元素进行改变(移动.变形.伸缩.扭曲)*/ .wrapper{ margin:100px 100px auto auto; width:300px; height:200px; border:2 ...

  2. 精确率与召回率,RoC曲线与PR曲线

    在机器学习的算法评估中,尤其是分类算法评估中,我们经常听到精确率(precision)与召回率(recall),RoC曲线与PR曲线这些概念,那这些概念到底有什么用处呢? 首先,我们需要搞清楚几个拗口 ...

  3. Mysql5&period;5命令行修改密码

    今天下载了mysql5.5.45免安装版,配置好之后发现mysql默认是没有设置密码的,也就是密码为空. 如果是本机作开发测试用,有无密码倒也无所谓,不过发布在服务器上没有密码肯定是不行的,那就需要设 ...

  4. 【原创】-- tftp安装配置及使用

    环境:Ubuntu 14.04  OK6410 环境搭建: (1) $ sudo apt-get install tftp tftpd openbsd-inetd 或者安装tftp的增强版本tftp- ...

  5. java中getBytes方法可能使图片文件产生的问题

    InputStream is = new FileInputStream(fl); ImageInputStream iis = ImageIO.createImageInputStream(is); ...

  6. WCF学习

    WCF初探-1:认识WCF MQ与Webservice的区别 Webservice 和MQ(MessageQueue)都是解决跨平台通信的常用手段,两者有哪些区别呢? 个人认为最本质的区别在于 Web ...

  7. setCentralWidget就可以把Qwidget设置为QMainWindow的主窗口

    前面说的return app.exec() 这句话是用来使程序进入事件循环,除了直接递交的事件外,所有的事件都要在这个循环中被一层一层的分发,最后找到相应的处理函数来处理事件. *窗口和*窗口是存 ...

  8. PHP开发之路之一--WAMP的安装和配置

    来到新公司,领导说后面一个web系统不用ASP.NET做了,用国外的一个Drupal进行二次开发.这个Drupal是基于PHP的一款开源CMS系统,那就必须要自学PHP咯~ 接下来说说正题吧: 一.安 ...

  9. 05-python基础

    1.python是什么? 解释性语言.高级语言.开源.简洁.方便.容易扩展 2.可变类型与不可变类型 可变类型:list.dict.可变集合set 不可变类型:数字,str,tuple元组,froze ...

  10. LGP5075【JSOI2012】分零食

    . 题解: 令$F$为欢乐度$f(x) = Ox^2 + Sx + U$的生成函数,常数项为$0$: 令$G(x) = \sum_{i=0}^{A} F^i (x) $ $ans = [x^M]G;$ ...