牛客小白月赛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 区间求和的更多相关文章
- 牛客网 牛客小白月赛5 I.区间 (interval)-线段树 or 差分数组?
牛客小白月赛5 I.区间 (interval) 休闲的时候写的,但是写的心情有点挫,都是完全版线段树,我的一个队友直接就水过去了,为啥我的就超内存呢??? 试了一晚上,找出来了,多初始化了add标记数 ...
- 牛客小白月赛5 I - 区间
看到一份不错的操作..... 链接:https://www.nowcoder.com/acm/contest/135/I 来源:牛客网 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a, ...
- 牛客小白月赛2 G 文 【模拟】
链接:https://www.nowcoder.com/acm/contest/86/G来源:牛客网 题目描述 Sεlιнα(Selina) 开始了新一轮的男友海选.她要求她的男友要德智体美劳样样都全 ...
- 牛客小白月赛6 G 指纹锁 set的自动排序 模板
链接:https://www.nowcoder.com/acm/contest/136/G来源:牛客网 题目描述 HA实验有一套非常严密的安全保障体系,在HA实验基地的大门,有一个指纹锁. ...
- 牛客网 牛客小白月赛2 G.文
G.文 链接:https://www.nowcoder.com/acm/contest/86/G 这个题wa了一发,有点智障,浮点数,式子里面要*1.0,忘了,然后wa了,改了就过了(脑子有坑) 代码 ...
- 牛客小白月赛17 A 小sun的假期
传送门 题意: 第一行两个数n,m,代表总共有n天,m个安排.接下来有m行,每行是一个安排l,r,代表从第l天到第r天,小sun有安排了.安排可能会重复. 小 sun 非常喜欢放假,尤其是那种连在一起 ...
- 牛客小白月赛1 G あなたの蛙は旅⽴っています【DP】
题目链接 https://www.nowcoder.com/acm/contest/85/G 思路 按照题解上的方式 存取数据 然后DP一下 就可以了 AC代码 #include <cstdio ...
- 牛客小白月赛5 I 区间 (interval) 【前缀和】
链接:https://www.nowcoder.com/acm/contest/135/I 题目描述 Apojacsleam喜欢数组. 他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次 ...
- 牛客小白月赛1 G あなたの蛙は旅⽴っています【图存储】【DP】
题目链接:https://www.nowcoder.com/acm/contest/85/G 思路: DP 空间可以优化成一维的, 用一维数组的 0 号单元保存左斜对角的值即可. 存图这里真不好理解 ...
随机推荐
- Netty与NIO
初识Netty Netty是由JBoss提供的一个Java的开源框架,是GitHub上的独立项目. Netty是一个异步的,基于事件驱动的网络应用框架,用于快速开发高性能.高可靠的网络IO程序. Ne ...
- JavaScript入门-函数function(二)
JavaScript入门-函数function(二) 递归函数 什么是递归函数? 递归简单理解就是,在函数体里,调用自己. //我们在求一个10的阶乘的时候,可能会这么做 //写一个循环 var to ...
- Java Mybatis快速入门之基本使用
目录 搭建环境 编写 Mybatis 核心配置文件 pom导出资源失败 测试 搭建环境 新建Maven项目 导入Maven依赖 <dependencies> <!--mysql驱动- ...
- 【UML】Use Case Diagrams
文章目录 Use Case Diagrams Introduction Use case Diagram Use Case Diagrams - Actors Use Case Diagrams – ...
- SpringBoot WebSocket技术
最近看了Spring in Action,了解了一下WebSocket和Stomp协议相关技术,并搭建了一个项目.网上的例子不完整或者描述不清,所以自己记录一下以作备忘. 一.配置 Spring Bo ...
- Docker-常用基建的安装与部署
一:Docker安装 1:通过yum安装docker yum -y install gcc yum -y install gcc-c++ yum remove docker \ docker-clie ...
- 【老孟Flutter】如何提高Flutter应用程序的性能
首先 Flutter 是一个非常高性能的框架,因此大多时候不需要开发者做出特殊的处理,只需要避免常见的性能问题即可获得高性能的应用程序. 重建最小化原则 在调用 setState() 方法重建组件时, ...
- USB充电限流芯片,输出短路关闭,过压关闭
PW1503,PW1502是超低RDS(ON)开关,具有可编程的电流限制,以保护电源源于过电流和短路保护.它具有超温保护以及反向闭锁功能. PW1503,PW1502采用薄型(1毫米)5针薄型SOT2 ...
- 原生ajax分享
最近被大佬问了一个很有趣的问题,你还能手打出一个ajax吗?,我当时的想法是有现成的为什么要自己打,后来我反思了一下(只有靠自己才是强者),在这里给大家分享一个我自己打的ajax,也是自己的一个知识点 ...
- 把Win10变成Mac OS:比任何美化主题都好用的工具
摘要:把Win10变成Mac OS:比任何美化主题都好用的工具 - 这是一款真正意义上的把Windows变成MacOS的软件,不用更换主题,不用修改Dll,直接是程序接管了Explorer,比任何美化 ...