日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

[BZOJ3781]小B的询问

發(fā)布時(shí)間:2025/3/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [BZOJ3781]小B的询问 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

[BZOJ3781]小B的詢問(wèn)

試題描述

小B有一個(gè)序列,包含N個(gè)1~K之間的整數(shù)。他一共有M個(gè)詢問(wèn),每個(gè)詢問(wèn)給定一個(gè)區(qū)間[L..R],求Sigma(c(i)^2)的值,其中i的值從1到K,其中c(i)表示數(shù)字i在[L..R]中的重復(fù)次數(shù)。小B請(qǐng)你幫助他回答詢問(wèn)。

輸入

第一行,三個(gè)整數(shù)N、M、K。 第二行,N個(gè)整數(shù),表示小B的序列。 接下來(lái)的M行,每行兩個(gè)整數(shù)L、R。

輸出

M行,每行一個(gè)整數(shù),其中第i行的整數(shù)表示第i個(gè)詢問(wèn)的答案。

輸入示例

6 4 3 1 3 2 1 1 3 1 4 2 6 3 5 5 6

輸出示例

6 9 5 2

數(shù)據(jù)規(guī)模及約定

對(duì)于全部的數(shù)據(jù),1<=N、M、K<=50000

題解

莫隊(duì)裸題。。。

就我的莫隊(duì)跑得慢(大概是因?yàn)橛昧?vector?)。。。

#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cctype> #include <algorithm> #include <vector> #include <cmath> using namespace std;int read() {int x = 0, f = 1; char c = getchar();while(!isdigit(c)){ if(c == '-') f = -1; c = getchar(); }while(isdigit(c)){ x = x * 10 + c - '0'; c = getchar(); }return x * f; }#define maxn 50010 #define maxbl 233 #define LL long longint A[maxn]; struct Que {int l, r;Que() {}Que(int _, int __): l(_), r(__) {} } qs[maxn];bool cmp(int a, int b) { return qs[a].r < qs[b].r; } vector <int> qid[maxbl]; int tot[maxn]; LL Ans[maxn];LL sqr(int x) { return (LL)x * x; }int main() {int n = read(), q = read(), K = read();for(int i = 1; i <= n; i++) A[i] = read();int m = sqrt(n + .5), cntb = 0;for(int i = 1; i <= q; i++) {int l = read(), r = read();qs[i] = Que(l, r);qid[(l-1)/m+1].push_back(i);cntb = max(cntb, (l - 1) / m + 1);}for(int i = 1; i <= cntb; i++) {sort(qid[i].begin(), qid[i].end(), cmp);memset(tot, 0, sizeof(tot));int l = 1, r = 0; LL ans = 0;for(vector <int> :: iterator j = qid[i].begin(); j != qid[i].end(); j++) {while(r < qs[*j].r) tot[A[++r]]++, ans = ans - sqr(tot[A[r]] - 1) + sqr(tot[A[r]]);while(l < qs[*j].l) tot[A[l]]--, ans = ans - sqr(tot[A[l]] + 1) + sqr(tot[A[l]]), l++;while(l > qs[*j].l) tot[A[--l]]++, ans = ans - sqr(tot[A[l]] - 1) + sqr(tot[A[l]]);Ans[*j] = ans;}}for(int i = 1; i <= q; i++) printf("%lld\n", Ans[i]);return 0; }

?

轉(zhuǎn)載于:https://www.cnblogs.com/xiao-ju-ruo-xjr/p/6747021.html

總結(jié)

以上是生活随笔為你收集整理的[BZOJ3781]小B的询问的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。