D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力

莫队算法就是优化的暴力算法。莫队算法是要把询问先按左端点属于的块排序,再按右端点排序。只是预先知道了所有的询问。可以合理的组织计算每个询问的顺序以此来降低复杂度。

                          D. Powerful array

典型的莫队算法题

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cmath>
 5 #include <algorithm>
 6 #include <string>
 7 #include <vector>
 8 #include <set>
 9 #include <map>
10 #include <stack>
11 #include <queue>
12 #include <sstream>
13 #include <iomanip>
14 using namespace std;
15 typedef long long LL;
16 const int INF=0x4fffffff;
17 const int EXP=1e-5;
18 const int MS=200005;
19
20 int a[MS];
21 int cnt[5*MS];
22 LL ans[MS];
23
24 struct node
25 {
26     int l,r;
27     int no,qid;
28     bool operator <(const node &a)const
29     {
30             return no<a.no||(no==a.no&&r<a.r);
31     }
32 }nodes[MS];
33
34
35 int n,SIZE;
36 LL res;
37 int L,R;
38 LL query(int x,int y,int flag)
39 {
40     if(flag)
41     {
42         for(int i=x;i<L;i++)
43         {
44             res+=(cnt[a[i]]<<1|1)*a[i];
45             cnt[a[i]]++;
46         }
47         for(int i=L;i<x;i++)
48         {
49             cnt[a[i]]--;
50             res-=(cnt[a[i]]<<1|1)*a[i];
51         }
52         for(int i=R+1;i<=y;i++)
53         {
54             res+=(cnt[a[i]]<<1|1)*a[i];
55             cnt[a[i]]++;
56         }
57         for(int i=y+1;i<=R;i++)
58         {
59             cnt[a[i]]--;
60             res-=(cnt[a[i]]<<1|1)*a[i];
61         }
62     }
63     else
64     {
65         for(int i=x;i<=y;i++)
66         {
67             res+=(cnt[a[i]]<<1|1)*a[i];
68             cnt[a[i]]++;
69         }
70     }
71     L=x;R=y;
72     return res;
73 }
74
75 int main()
76 {
77     int Q;
78     scanf("%d%d",&n,&Q);
79     for(int i=1;i<=n;i++)
80     {
81         scanf("%d",&a[i]);               //   注意%d的速度远大于%I64d的速度
82                                                    //   在大量数据输入时,能用%d就不要用%I64d,但千万要注意数据溢出
83     }
84     SIZE=sqrt(n+0.5);
85     for(int i=0;i<Q;i++)
86     {
87         scanf("%d%d",&nodes[i].l,&nodes[i].r);
88         nodes[i].no=nodes[i].l/SIZE;
89         nodes[i].qid=i;
90     }
91     sort(nodes,nodes+Q);
92     memset(cnt,0,sizeof(cnt));
93     res=0;
94     for(int i=0;i<Q;i++)
95         ans[nodes[i].qid]=query(nodes[i].l,nodes[i].r,i);
96     for(int i=0;i<Q;i++)
97         printf("%I64d\n",ans[i]);
98     return 0;
99 }
时间: 2024-10-05 04:49:52

D. Powerful array 莫队算法或者说块状数组 其实都是有点优化的暴力的相关文章

codeforces 86D D. Powerful array(莫队算法)

题目链接: D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standard output An array of positive integers a1, a2, ..., an is given. Let us consider its arbitrary subarray al, al + 1..., ar, wh

CodeForces - 86D Powerful array (莫队)

题意:查询的是区间内每个数出现次数的平方×该数值的和. 分析:虽然是道莫队裸体,但是姿势不对就会超时.答案可能爆int,所以要开long long 存答案.一开始的维护操作,我先在res里减掉了a[pos]*cnt[a[pos]]*cnt[a[pos]],将cnt[a[pos]]+1,再将乘积加回.其实根据数学原理,K^2和(K+1)^2差值是2K+1,那么其实每次更新时只要加上或减去a[pos]*(2*cnt[pos]+1)即可,这样更高效. #include<bits/stdc++.h>

【莫队算法】【权值分块】bzoj3920 Yuuna的礼物

[算法一] 暴力. 可以通过第0.1号测试点. 预计得分:20分. [算法二] 经典问题:区间众数,数据范围也不是很大,因此我们可以: ①分块,离散化,预处理出: <1>前i块中x出现的次数(差分): <2>第i块到第j块中的众数是谁,出现了多少次. 询问的时候,对于整块的部分直接获得答案:对于零散的部分,暴力统计每个数出现 的次数,加上差分的结果,尝试更新ans. 时间复杂度O(m*sqrt(n)), 空间复杂度O(n*sqrt(n)). ②考虑离线,莫队算法,转移的时候使用数据

BZOJ 2038 小Z的袜子(莫队算法)

莫队算法如果我们已知[l,r]的答案,能在O(1)时间得到[l+1,r]的答案以及[l,r-1]的答案,即可使用莫队算法.时间复杂度为O(n^1.5).如果只能在logn的时间移动区间,则时间复杂度是O(n^1.5*log n).其实就是找一个数据结构支持插入.删除时维护当前答案. 这道题的话我们很容易用数组来实现,做到O(1)的从[l,r]转移到[l,r+1]与[l+1,r]. 那么莫队算法怎么做呢?以下都是在转移为O(1)的基础下讨论的时间复杂度.另外由于n与m同阶,就统一写n.如果已知[l

信心题--FUOJ2226(莫队算法)

http://acm.fzu.edu.cn/problem.php?pid=2226 信心题,还说是信心题,题目给的真好.但是一点都不像信心题. 又是一个新的算法,莫队算法 莫队算法是一个用数组就可以轻易实现的神奇数据结构,可以处理一类无修改的离线区间查询问题(PS:暂时还没有遇到莫队解决更新区间查询的问题) 莫队算法可以在O(1),实现[l, r]到[l, r±1] / [l±1, r]的转移,然后我们就可以对所有查询分sqrt(n)块,把每个查询所在的块号当做第一关键字,右端点作为第二关键字

莫队算法&amp;#183;初探总结

莫队算法分那么几类: 普通序列 带修改 树上 回滚 支持在线 其实上述的类型还可以组合起来(非常的毒瘤). 个人理解莫队算法的精髓在于如何利用暴力将答案再合理的时间和空间内跑出来.说白了: \[莫队算法=一种很牛逼的自定义排序+分块处理+暴力 \] 首先要理解自定义排序,这个排序之后整个序列可以最快地处理所有的询问(这里暂时不谈第五类问题(支持在线),这里认为莫队是只能离线处理问题的,必须先把所有的问题都离线下来).怎么为之快,快要看左端点移动的总距离+右端点移动的总距离最小.那么一般用块的奇偶

D. Powerful array 离线+莫队算法 给定n个数,m次查询;每次查询[l,r]的权值; 权值计算方法:区间某个数x的个数cnt,那么贡献为cnt*cnt*x; 所有贡献和即为该区间的值;

D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard input output standard output An array of positive integers a1,?a2,?...,?an is given. Let us consider its arbitrary subarray al,?al?+?1...,?ar, where 1?

XOR and Favorite Number(莫队算法+分块)

E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pai

CodeFroce Round 340 div2 E XOR and Favorite Number【莫队算法】

题面: Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l?≤?i?≤?j?≤?r and the xor of the numbers ai,?ai?