小C的詢問

2021-10-09 08:39:23 字數 1866 閱讀 4092

小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...