NBUT 1457 B - Sona

同小Z的袜子,只是需要离散化,平方变成了立方

//#include<bits/stdc++.h>
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
#define N 100010
#define LL long long

using namespace std;
struct node
{
    int l,r,id;
};

int n,m,t;
int pos[N],c[N],a[N];
LL s[N],ans[N];
node q[N];

void init()
{
    memset(s,0,sizeof(s));
    int unit=int(sqrt(n));
    for (int i=1;i<=n;i++)
        if (i%unit==0) pos[i]=i/unit; else pos[i]=i/unit+1;
}

bool cmp(node a, node b)
{
    if (pos[a.l]==pos[b.l]) return a.r<b.r;
    else return pos[a.l]<pos[b.l];
}

LL gcd(LL a, LL b)
{
    if (b==0) return a;
    return gcd(b,a%b);
}

int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        init();
        for (int i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            c[i]=a[i];
        }
        sort(a+1,a+n+1);
        t=unique(a+1,a+n+1)-a-1;
        for (int i=1;i<=n;i++) c[i]=lower_bound(a+1,a+t+1,c[i])-a;
        scanf("%d",&m);
        for (int i=1;i<=m;i++)
        {
            scanf("%d%d",&q[i].l,&q[i].r);
            q[i].id=i;
        }
        sort(q+1,q+m+1,cmp);
        int l=1,r=1;
        LL tmp=1;
        s[c[1]]=1;
        for (int i=1;i<=m;i++)
        {
            while(r<q[i].r)
            {
                r++;
                tmp=tmp-s[c[r]]*s[c[r]]*s[c[r]];
                s[c[r]]++;
                tmp=tmp+s[c[r]]*s[c[r]]*s[c[r]];
            }
            while(r>q[i].r)
            {
                tmp=tmp-s[c[r]]*s[c[r]]*s[c[r]];
                s[c[r]]--;
                tmp=tmp+s[c[r]]*s[c[r]]*s[c[r]];
                r--;
            }
            while(l<q[i].l)
            {
                tmp=tmp-s[c[l]]*s[c[l]]*s[c[l]];
                s[c[l]]--;
                tmp=tmp+s[c[l]]*s[c[l]]*s[c[l]];
                l++;
            }
            while(l>q[i].l)
            {
                l--;
                tmp=tmp-s[c[l]]*s[c[l]]*s[c[l]];
                s[c[l]]++;
                tmp=tmp+s[c[l]]*s[c[l]]*s[c[l]];
            }
            ans[q[i].id]=tmp;
        }
        for (int i=1;i<=m;i++) printf("%I64d\n",ans[i]);
    }
    return 0;
}

  

时间: 2024-10-10 23:17:44

NBUT 1457 B - Sona的相关文章

NBUT 1457 Sona (莫队算法)

题目大意: 求一段区间内 出现的数字的次数的三次方的和 思路分析: 这要水过去的题目真是难,各种优化. 不能用map , 要离散化之后 先处理lowerbound.优化输入... 时间卡的很紧.. 题目直接用莫队水过去. 如果你超时的话,不妨试试上面三种优化. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <map> #

NBUT 1457 Sona

莫队算法+离散化 1.map会TLE,必须离散化做 2.long long会WA,__int64定义 %I64d输出输出能AC 3.注意输入的序列会爆int #include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<map> #include<algorithm> using namespace std; const int maxn = 1

(莫队算法)两题莫队算法统计数量的入门题

因为这两题差不多,而且比较简单,就放一起,做了这题,这种题目就是巨水的题了.随便写都行. CodeForces - 86D  Powerful array 题意: 多次查询数列中从L到R每个数字出现次数的平方乘这个数字的和. 代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <cmath> 5 #include <map> 6 #includ

bzoj 2038 小z的袜子 莫队例题

莫队,利用可以快速地通过一个问题的答案得到另一问题的答案这一特性,合理地组织问题的求解顺序,将已解决的问题帮助解决当前问题,来优化时间复杂度. 典型用法:处理静态(无修改)离线区间查询问题. 线段树也是处理区间问题的一个有力工具,它和莫队算法各有特点: 线段树可以支持修改,并且单次操作时间复杂度一般为O(log),支持在线,但是要求可以进行快速的区间合并操作,两个区间如不能快速合并(f(n)*O(log)>O(n)),则用线段树就没有什么实际价值了(暴力都比它块) 莫队算法可以解决某些线段树不能

ACM: NBUT 1105 多连块拼图 - 水题 - 模拟

NBUT 1105  多连块拼图 Time Limit:1000MS     Memory Limit:65535KB     64bit IO Format: Practice Appoint description:  System Crawler  (Aug 12, 2016 9:32:14 AM) Description 多连块是指由多个等大正方形边与边连接而成的平面连通图形. -- 维基百科 给一个大多连块和小多连块,你的任务是判断大多连块是否可以由两个这样的小多连块拼成.小多连块只能

Trie树 + DFS - CSU 1457 Boggle

Boggle Problem's Link: http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457 Mean: 给定n个串,有m个询问. 每个询问给你一个4*4的字符矩阵,你可以在这个字符矩阵中任意字符出发,向四个方向走(已走过的不可重复走),走出一个字符串. 如果n个串中有对应的串和走出的字符串相同,那么需要求出: 1.不同长度的串给了不同的权值,n个串中出现的串的总权值是多少? 2.从出现的字符串中找一个最长的出来,如果有多个,找一个字典

题目1457:非常可乐(广度优先遍历BFS)

题目链接:http://ac.jobdu.com/problem.php?pid=1457 详解链接:https://github.com/zpfbuaa/JobduInCPlusPlus 参考代码: // // 1457 非常可乐.cpp // Jobdu // // Created by PengFei_Zheng on 22/04/2017. // Copyright © 2017 PengFei_Zheng. All rights reserved. // #include <stdio

hihocoder #1457 : 后缀自动机四&#183;重复旋律7

#1457 : 后缀自动机四·重复旋律7 时间限制:15000ms 单点时限:3000ms 内存限制:512MB 描述 小Hi平时的一大兴趣爱好就是演奏钢琴.我们知道一段音乐旋律可以被表示为一段数构成的数列. 神奇的是小Hi发现了一部名字叫<十进制进行曲大全>的作品集,顾名思义,这部作品集里有许多作品,但是所有的作品有一个共同特征:只用了十个音符,所有的音符都表示成0-9的数字. 现在小Hi想知道这部作品中所有不同的旋律的“和”(也就是把串看成数字,在十进制下的求和,允许有前导0).答案有可能

NBUT 1525 Cow Xor(01字典树+前缀思想)

[1525] Cow Xor 时间限制: 2000 ms 内存限制: 65535 K 问题描述 农民约翰在喂奶牛的时候被另一个问题卡住了.他的所有N(1 <= N <= 100,000)个奶牛在他面前排成一行(按序号1..N的顺序),按照它们的社会等级排序.奶牛#1有最高的社会等级,奶牛#N最低.每个奶牛同时被指定了一个不唯一的附加值,这个数在0..2^21 - 1的范围内. 帮助农民约翰找出应该从哪一头奶牛开始喂,使得从这头奶牛开始的一个连续的子序列上,奶牛的附加值的异或最大. 如果有多个这