codefroce D. Powerful array[初识块状数组]

由于是初始所以,仅仅能先用别人的分析。囧。。。

题目:

给定一个数列:A1, A2,……,An,定义Ks为区间(l,r)中s出现的次数。

t个查询,每一个查询l,r,对区间内全部a[i],求sigma(K^2*a[i])

离线+分块

将n个数分成sqrt(n)块。

对全部询问进行排序,排序标准:

1. Q[i].left /block_size < Q[j].left / block_size (块号优先排序)

2. 假设1同样,则 Q[i].right < Q[j].right (依照查询的右边界排序)

问题求解:

从上一个查询后的结果推出当前查询的结果。(这个看程序中query的部分)

假设一个数已经出现了x次,那么须要累加(2*x+1)*a[i],由于(x+1)^2*a[i] = (x^2 +2*x + 1)*a[i],x^2*a[i]是出现x次的结果,(x+1)^2 * a[i]是出现x+1次的结果。

时间复杂度分析:

排完序后,对于相邻的两个查询,left值之间的差最大为sqrt(n),则相邻两个查询左端点移动的次数<=sqrt(n),总共同拥有t个查询,则复杂度为O(t*sqrt(n))。

又对于同样块内的查询,right端点单调上升,每一块全部操作,右端点最多移动O(n)次,总块数位sqrt(n),则复杂度为O(sqrt(n)*n)。

right和left的复杂度是独立的,因此总的时间复杂度为O(t*sqrt(n)  +  n*sqrt(n))。

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std; typedef long long LL;
const int V = 200000 + 10;
const int MAXN = 1000000 + 10; struct node{
int l,r,id;
}query[V]; int n,t,num[V],L,R,sum[MAXN];
LL ans[MAXN],now; bool cmp(node a,node b){
int m = sqrt(1.0*n); //最好的理论值
if(a.l / m != b.l / m){
return a.l < b.l;
}
return a.r < b.r;
} void modify(int l,int r){ while(L < l){ //左区间不包括
sum[num[L]]--;
now -= num[L] * (sum[num[L]] << 1 | 1);
L++;
} while(R > r){ //右区间不包括
sum[num[R]]--;
now -= num[R] * (sum[num[R]] << 1 | 1);
R--;
} while(L > l){ //上一区间的左区间包括在当前区间里
L--;
now += num[L] * (sum[num[L]] << 1 | 1);
sum[num[L]]++; } while(R < r){ //上一区间的右区间包括在当前区间里
R++;
now += num[R] * (sum[num[R]] << 1 | 1);
sum[num[R]]++;
}
} int main()
{
while(~scanf("%d%d",&n,&t)){
for(int i = 1;i <= n;++i){
scanf("%d",&num[i]);
} for(int i = 1;i <= t;++i){
scanf("%d%d",&query[i].l,&query[i].r);
query[i].id = i;
} sort(query+1,query + t + 1,cmp);
now = L = R = 0;
memset(sum,0,sizeof(sum)); for(int i = 1;i <= t;++i){
modify(query[i].l,query[i].r);
ans[query[i].id] = now;
} for(int i = 1;i <= t;++i){
printf("%I64d\n",ans[i]);
}
}
return 0;
}

codefroce D. Powerful array[初识块状数组]的更多相关文章

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

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

  2. Yandex.Algorithm 2011 Round 2 D. Powerful array 莫队

    题目链接:点击传送 D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input ...

  3. CodeForces - 86D D. Powerful array —— 莫队算法

    题目链接:http://codeforces.com/problemset/problem/86/D D. Powerful array time limit per test 5 seconds m ...

  4. CodeForces 86 D Powerful array 莫队

    Powerful array 题意:求区间[l, r] 内的数的出现次数的平方 * 该数字. 题解:莫队离线操作, 然后加减位置的时候直接修改答案就好了. 这个题目中发现了一个很神奇的事情,本来数组开 ...

  5. Codeforces 86D Powerful array (莫队)

    D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard i ...

  6. CodeForces 86D Powerful array(莫队+优化)

    D. Powerful array time limit per test 5 seconds memory limit per test 256 megabytes input standard i ...

  7. POJ 2887 Big String (块状数组)

    题意:给一个字符串(<=1000000)和n个操作(<2000),每个操作可以在某个位置插入一个字符,或者查询该位置的字符.问查询结果. 思路:块状数组. 如果将原来的字符串都存在一起,每 ...

  8. Big String 块状数组(或者说平方分割)

    Big String 给一个字符串,长度不超过 106,有两种操作: 1. 在第 i 个字符的前面添加一个字符 ch 2. 查询第 k 个位置是什么字符 操作的总数不超过 2000 如果直接模拟的话, ...

  9. javascript中的稀疏数组(sparse array)和密集数组

    学习underscore.js数组相关API的时候.遇到了sparse array这个东西,曾经没有接触过. 这里学习下什么是稀疏数组和密集数组. 什么是密集数组呢?在java和C语言中,数组是一片连 ...

随机推荐

  1. C语言总结之---关键字

    我记得我开始学习C语言的时候,那时候还在读高中,我们老师就把C语言的关键字,全部写在黑板上,老师说我们下面的两节课的内容就是(把它给记下来) 你还记得标准C有多少个关键字吗? 第一:关键字描述 C99 ...

  2. poj 2126 Factoring a Polynomial 数学多项式分解

    题意: 给一个多项式,求它在实数域内的可分解性. 分析: 代数基本定理. 代码: //poj 2126 //sep9 #include <iostream> using namespace ...

  3. SRM 627 D1L2GraphInversionsDFS查找指定长度的所有路径 Binary indexed tree (BIT)

    题目:http://community.topcoder.com/stat?c=problem_statement&pm=13275&rd=16008 由于图中边数不多,选择DFS遍历 ...

  4. Complete Guide for Spring Boot Actuator

    You are here to learn about Spring Boot Actuator for collecting metrics about your production grade ...

  5. 什么是防盗链设置中的空Referer

    设置防盗链时候指明和不指明空Referer的差别及实现后的效果? 什么是Referer? 这里的 Referer 指的是HTTP头部的一个字段,也称为HTTP来源地址(HTTP Referer).用来 ...

  6. 『openframeworks』shader制作三角形马赛克效果

    不久前做了六边形马赛克的效果,很有意思,乘热打铁,弄了个三角形马赛克. 首先肯定是等边三角形,这样才能真正的无缝拼接.观察发现,三角形可以拼接成之前做个的六边形. 如下图: 我们可以发现6个三角形正好 ...

  7. javacsript (十一) 对象

    他的对象的概念和python的字典的格式一样, JavaScript 对象 对象由花括号分隔.在括号内部,对象的属性以名称和值对的形式 (name : value) 来定义.属性由逗号分隔: var ...

  8. Delphi中使用python脚本读取Excel数据

    Delphi中使用python脚本读取Excel数据2007-10-18 17:28:22标签:Delphi Excel python原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 . ...

  9. 与众不同 windows phone (8) - Tile(磁贴)

    原文:与众不同 windows phone (8) - Tile(磁贴) [索引页][源码下载] 与众不同 windows phone (8) - Tile(磁贴) 作者:webabcd介绍与众不同 ...

  10. 使用iftop网络流量监控

    iftop这是一个非常有用的工具.下面的命令监视无线网卡在我的笔记本 iftop -i wlan0 比如,我现在玩音乐视频.iftop显示的信息: 基本说明: 1. 屏幕主要部分都是表示两个机器之间的 ...