小b有乙個序列,包含n個1~k之間的整數。他一共有m個詢問,每個詢問給定乙個區間[l..r],求sigma(c(i)^2)的值,其中i的值從1到k,其中c(i)表示數字i在[l..r]中的重複次數。小b請你幫助他回答詢問。
第一行,三個整數n、m、k。
第二行,n個整數,表示小b的序列。
接下來的m行,每行兩個整數l、r。
m行,每行乙個整數,其中第i行的整數表示第i個詢問的答案。
輸入 #1複製
6 4 3
1 3 2 1 1 3
1 42 6
3 55 6
輸出 #1複製
695
2
對於全部的資料,1<=n、m、k<=50000
題目大意 : 輸入長度為 n 的序列, 有m 次查詢, 每次查詢某個區間內, 輸出所有數的出現次數的平方和
accepted code
#include#includeusing namespace std;
#define sc scanf
#define ls rt << 1
#define rs ls | 1
#define min(x, y) x = min(x, y)
#define max(x, y) x = max(x, y)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define mem(x, b) memset(x, b, sizeof(x))
#define lowbit(x) ((x) & -(x))
#define p2(x) ((x) * (x))
typedef long long ll;
const int mod = 1e9 + 7;
const int maxn = 1e5 + 100;
const int inf = 0x3f3f3f3f;
inline ll fpow(ll a, ll b)return r; }
struct node
e[maxn];
int p[maxn], belong[maxn], n, m, k;
int num[maxn], sz, sum, l = 1, r;
ll pre[maxn], ans;
bool cmp(node a, node b)
void add(int x)
void del(int x)
int main()
for (int i = 1; i <= n; i++) sc("%d", &p[i]);
for (int i = 1; i <= m; i++) sc("%d %d", &e[i].l, &e[i].r), e[i].x = i;
sort(e + 1, e + m + 1, cmp);
for (int i = 1; i <= m; i++)
for (int i = 1; i <= m; i++) printf("%lld\n", pre[i]);
return 0;
}
洛谷P2709 小B的詢問 莫隊
按根下n分個塊,對詢問區間雙關鍵字排序,若不在乙個塊裡按左端點排序,若在按右端點排序,然後掃一遍統計答案 考慮每次移動指標後答案的改變 分為四種情況 分別是l,r指標在查詢區間的l和r的左邊還是右邊,都討論一下 每種情況該怎麼做在紙上畫畫就明白了。沒必要特意記 include include inc...
莫隊,分塊 洛谷P2709 小B的詢問
給定乙個長度為 n n 的序列,m role presentation m m次詢問,詢問 1.k 1.k 的所有數在l.rl r中出現了幾次,求它們的平方和 樸素演算法tl e tle 線段樹tl e tle 可能是我打的不夠優美 又突然想到這道題貌似沒有修改,於是就打了乙個不帶修改的莫隊 首先,...
洛谷P2709 小B的詢問 基礎莫隊
洛谷p2709小b的詢問 void add int x void remove int x 這兩個函式都是用來處理l,r指標移動時對答案的貢獻,x是移走 來的點的id for int i 1 i m i 下面是預處理 int len sqrt n query i k query i l 1 len ...