codeforce 86D Powerful array 莫对算法

原创 2015年07月08日 20:08:12

简单莫队算法题,对于她给的公式来说怎么,每一次转移区间的是候用一个数组来位数每个数值的数的个数即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
const int maxn=200005;
typedef long long LL;
int a[1000006],b[maxn];
struct pi{
    int l,r;
    int x;
    int id;
}pp[maxn];
LL s1[maxn];
int cmp(pi a,pi b){
    if(a.x!=b.x) return a.x<b.x;
    return a.r<b.r;
}
int main()
{
    int i,j,n,m,p;
    cin>>n>>m;
    for(i=1;i<=n;i++) scanf("%d",&b[i]);
    LL s=0;
    p=sqrt(n);
    for(i=0;i<m;i++){
        scanf("%d%d",&pp[i].l,&pp[i].r);
        pp[i].id=i;
        pp[i].x=(pp[i].l-1)/p+1;
    }
    sort(pp,pp+m,cmp);
    int l=0,r=0;
    for(i=0;i<m;i++){
        if(i==0){
            for(j=pp[i].l;j<=pp[i].r;j++){
                if(a[b[j]]>=0){ s-=(LL)a[b[j]]*a[b[j]]*b[j];
                    s+=(LL)(a[b[j]]+1)*(a[b[j]]+1)*b[j];
                }
                a[b[j]]++;
            }
        }
        else{
            if(l<pp[i].l){
                for(j=l;j<pp[i].l;j++){
                    if(a[b[j]]>0){
                        s-=(LL)a[b[j]]*a[b[j]]*b[j];
                        s+=(LL)(a[b[j]]-1)*(a[b[j]]-1)*b[j];
                    }
                    a[b[j]]--;
                }
            }
            else {
                for(j=l-1;j>=pp[i].l;j--){
                    if(a[b[j]]>=0){ s-=(LL)a[b[j]]*a[b[j]]*b[j];
                        s+=(LL)(a[b[j]]+1)*(a[b[j]]+1)*b[j];
                    }
                    a[b[j]]++;
                }
            }
            if(r<pp[i].r){
                for(j=r+1;j<=pp[i].r;j++){
                    if(a[b[j]]>=0){ s-=(LL)a[b[j]]*a[b[j]]*b[j];
                        s+=(LL)(a[b[j]]+1)*(a[b[j]]+1)*b[j];
                    }
                    a[b[j]]++;
                }
            }
            else{
                for(j=r;j>pp[i].r;j--){
                    if(a[b[j]]>0){
                        s-=(LL)a[b[j]]*a[b[j]]*b[j];
                        s+=(LL)(a[b[j]]-1)*(a[b[j]]-1)*b[j];
                    }
                    a[b[j]]--;
                }
            }
        }
        s1[pp[i].id]=s;
        l=pp[i].l;
        r=pp[i].r;
    }
    for(i=0;i<m;i++) printf("%I64d\n",s1[i]);


相关文章推荐

CodeForces 86D Powerful array 莫队算法

对于每个询问统计区间内每种数字出现次数的平方乘以数字本身的和。 莫队裸题。#include #include #include using namespace std; typedef lon...

【打CF,学算法——四星级】CodeForces 86D Powerful array (莫队算法)

题目链接:CF 86D 题面: D. Powerful array time limit per test 5 seconds memory limit per test 256 m...

CF 86D Powerful array 分块算法入门,n*sqrt(n)

简介:分块算法主要是把区间划分成sqrt(n)块,从而降低暴力的复杂度, 其实这算是一种优化的暴力吧,复杂度O(n*sqrt(n)) 题意:给定一个数列:a[i]    (1 有t个查询,...
  • c3568
  • c3568
  • 2013年08月18日 19:31
  • 1736

【CF86D】Powerful array

莫队裸题 每次加入一个a[i],ans=ans-k(a[i])^2*a[i]+(k(a[i])+1)^2*a[i],去掉一个a[i]同理,都能在O(1)的时间里完成转移。我做的时候把这个式子化开来了...
  • Ripped
  • Ripped
  • 2017年04月17日 14:29
  • 93

codeforces 86 D Powerful array

codeforces 86 D powerful array

Codeforces 86D. Powerful array (MO's Algorithm(区间查询的离线优化))

题意:给一个长度为n的数组,有 t 个区间询问,求一个特定的值。这个值 = 对区间内出现的每个值v,累加 V 乘上(V的出现次数的平方)。 刚刚学了MO's Algorithm,看文章说这题比较经...

Codeforces 86D Powerful array 分块

题意:给定数字的序列,然后给出一堆询问 zai mou

codeforce 871D Imbalanced Array

题目大意: 然后就i是输入一个整数n,然后输入n个整数,然后求这个区间的子区间的最大值最小值的差值的和; 基本思路: 转化为用单调栈求每一个值作为最大值和最小值能管到的区间范围,然后求每一个以该...

CodeForces 220B Little Elephant and Array 莫队算法

题目:http://codeforces.com/problemset/problem/220/B 题意:给定一个数组,每次询问一个区间[l, r],问这个区间内元素出现个数等于元素本身的出现了几次...

codeforce 315B Sereja and Array 【水题,封顶距离统计 OR 线段树延迟更新】

Sereja and Array time limit per test 1 second memory limit per test 256 megabytes i...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:codeforce 86D Powerful array 莫对算法
举报原因:
原因补充:

(最多只允许输入30个字)