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. [课堂实践与项目]IOS只能进行简单的加减乘除的没有优先级的计算器

    // // LCViewController.m // calculator // // Created by lichan on 13-12-3. // Copyright (c) 2013年 co ...

  2. 基于visual Studio2013解决面试题之0203栈实现

     题目

  3. 将n进制的数组压缩成字符串(0-9 a-z)同一时候解压

    比如一个3进制的数组: [1 1 2 2 2 0 0] 用一个字符串表示... 此类题目要明白两点: 1. 打表:用数组下标索引字符.同一时候注意假设从字符相应回数字: int index = (st ...

  4. Android 3d云标签

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbWluZ3l1ZV8xMTI4/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  5. jquery实现鼠标焦点十字效果

    系统开发时很多地方需要有焦点效果,例如:鼠标点击聚焦,地图定位,在图片上突出显示,焦点定位页面元素. 本小功能通过jquery和graphics二次开发,实现通过鼠标点击页面任何区域,聚焦当前点击位置 ...

  6. 用VC制作应用程序启动画面

    摘 要:本文提供了四种启动画面制作方法. 使用启动画面一是可以减少等待程序加载过程中的枯燥感(尤其是一些大型程序):二是 可以用来显示软件名称和版权等提示信息.怎样使用VC++制作应用程序的启动画面呢 ...

  7. form表单多值提交

    $.ajax({ cache: true, type: "POST", url:ajaxCallUrl, data:$('#yourformid').serialize(),// ...

  8. vs2013 IntelliSense: &quot;const char *&quot; 类型的实參与 &quot;LPCWSTR&quot; 类型的形參不兼容

    错误例如以下: 解决方法: project字符集选择多字符

  9. js弹出对话框,遮罩效果,

    刚刚来到实习单位,我跟着廖哥做项目.然后他分配给我一个小小的任务,实现起来总的效果如下: 然后,但我们单击显示数目这个链接的时候,就会弹出一个又遮罩效果的对话框,如下图: 当我们在对话框中再点击里面的 ...

  10. ADO异步查询显示进度条

    一般,ADO都是以同步的方式来处理数据.这就是说,当ADO开始处理数据后,应用程序必须等到ADO处理完毕之后才可以继续执行.但是除了同步执行方式之外,ADO也提供了异步执行的方式,允许当ADO处理时, ...