問題描述
有n個球,序號分別為1到n,每個球有乙個顏色,顏色的序號為1到m。
你需要處理一類詢問:給定乙個區間左右邊界(包含),求這個區間內有多少種不同顏色的球。
輸入格式
第一行,球的個數n和顏色的範圍m
接下來n行,每行乙個數,第i行的數表示第i個球的顏色。
接下來一行,為詢問的個數q
接下來q行,每行兩個數,為區間的左右邊界l和r,l<=r。
輸出格式
q行,每行乙個數,為該區間內的顏色種類數。
樣例輸入
10 4
1 3
2 2
4 3
1 3
2 4
6 1 5
2 6
4 4
6 8
8 10
7 10
樣例輸出
4 3
1 2 3 4
資料規模和約定
對於100%的資料,n<=200000, q<=200000, m<=n
對於50%的資料,m<=30
提示輸入資料規模較大。
看到這種區間查詢的第一想法就是分塊,之後發現用資料結構貌似並不好做,又因為是這種區間查詢,所以就會想到莫隊演算法。
把q個查詢先按l排序,之後分成n√
塊,每塊內按r排序,之後直接暴力維護得到答案即可。
#include
#include
#include
#include
#include
#include
using
namespace
std;
ifstream cin("colorball.in");
ofstream cout("colorball.out");
int n, m;
int c[200050];
int col[200050];
int cnt;
class op ;
int q;
op a[200050];
int ans[200050];
void readin() {
2013藍橋杯第二題 馬虎的算式
小明是個急性子,上小學的時候經常把老師寫在黑板上的題目抄錯了。有一次,老師出的題目是 36 x 495 他卻給抄成了 396 x 45 但結果卻很戲劇性,他的答案竟然是對的!因為 36 495 396 45 17820 類似這樣的巧合情況可能還有很多,比如 27 594 297 54 假設 a b ...
第二期訓練題第1題
problem description 在乙個國家僅有1分,2分,3分硬幣,將錢n兌換成硬幣有很多種兌法。請你程式設計序計算出共有多少種兌法。input 每行只有乙個正整數n,n小於32768。output 對應每個輸入,輸出兌換方法數。sample input 2934 12553 sample ...
第二期訓練題1
問題分析 該題只需按照題目要求輸入資料,並將每組資料的第乙個作為最小值,再將這個最小值逐一與輸入的資料比較大小,如果輸入的資料小於最小值,則將輸入的資料代替最小值,最後得到這組資料的最小值。ac通過的 如下 includeusing namespace std int main if m 0 cou...