小c的詢問
description
小k魔導師得到了乙個序列,這個序列有n個數。他困惑了,小c詢問了它q個問題,他都回答不上來,現在他來請教你。對於每乙個詢問都由一組[l, r]組成,問題是要回答這個區間所有數的和,所有數的與,所有數的或。聰明的你一定能幫助小k回答這些問題。
input
輸入第一行為乙個t,代表有t組資料,每組資料第一行為乙個n,第二行為n個整數。第三行為乙個q,代表有q個詢問,每個詢問都由一組[l, r]組成。
(1 <= t <= 10, 1 <= l <= r <= n ,q <= 1000000,1 <= 每個數的範圍 <= 1000)
output
對於每組測試資料,輸出q行答案,每行答案由三個數組成,分別是[l, r]區間的和,與,或,中間用空格隔開。
sample input 1110
1 2 3 5 4 4 6 7 8 10
101 3
2 43 5
8 10
4 10
4 71 10
2 84 10
4 8sample output 1
6 0 3
10 0 7
12 0 7
25 0 15
44 0 15
19 4 7
50 0 15
31 0 7
44 0 15
26 4 7
hint
資料量過大,請使用快讀。//超實用
模板如下
c選手:
inline ll read()
while (c >= '0' && c <= '9')
return x * f;}
c++選手:
ios::sync_with_stdio(false), cout.tie(0), cin.tie(0);//這題不怎麼頂用
大佬:每個數的範圍在【1,1000】,也就是二進位制最多10位,可以開乙個cnt[n][10]的陣列,維護字首二進位制1的個數,和的話單獨用乙個陣列維護,每次查詢時,和是o(1)算出,與的話是看每一位,如果當前這位1的個數等於區間長度就加上1<#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define ios ios_base::sync_with_stdio(0); cin.tie(0);
#define ll long long
const ll n =
1e6+66;
inline ll read()
while
(c >=
'0'&& c <=
'9')
return x * f;
}ll a[n]
,o[n][11
],s[n]
;int
main()
for(
int i=
1;i<=n;i++
)s[i]
=s[i-1]
+a[i]
; q=
read()
;for
(int i=
1;i<=q;i++
)printf
("%lld %lld %lld\n"
,s[r]
-s[l-1]
,and,or);}
}return0;
}快讀是真的快,愣是把4.7s的time limit exceed變成了2.9s的ac了
i了i了不過只能輸入數字
考查位操作的使用
小B的詢問
這裡不講莫隊的思路,各路大神已經講清楚了。我們講一下如何卡常。把正常的莫隊交上去,記錄。單個點 1784ms 把每一次詢問的右邊界 right i 從小到大改為從打到小,快了了一點。注意要把陣列開小點。1522ms 如果分為 trunc sqrt n 塊不好,然後分別試著分為 n 6 和 n 10 ...
莫隊 小B的詢問
莫隊經典例題 這題詢問每一種數字數量的平方和,那麼我們在左移或右移的時候記錄一下就好了,當每一種數字的種類數加1或減1的時候,我們需要減去以前這個數對答案的影響,加上現在對答案的影響。假設原來數字a的種類數為k,如今又加入乙個a,那麼先ans k2,然後ans k 1 2.刪除同理。include ...
小H的詢問(線段樹)
線段樹需要維護的 最大有效子區間權值和,左端最大有效子區間權值和,右端最大有效子區間權值和,區間和,本區間有效性。include include include include include include include define maxn 1000005 using namespace s...