【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)
題干:
鏈接:https://ac.nowcoder.com/acm/contest/157/C
來源:牛客網(wǎng)
題目描述
????PH試紙,是一種檢測(cè)酸堿度的試紙,試紙紅色為酸性,藍(lán)色為堿性。
????HtBest有一個(gè)PH試紙,試紙被分成了n段,每一段都可以被染色成紅色或者藍(lán)色,WHZ在試紙的每一段上都染為一種顏色,HtBest有m個(gè)詢問,對(duì)于每個(gè)詢問,Ta想知道某種顏色第qi次在什么地方出現(xiàn)。
輸入描述:
第一行有兩個(gè)正整數(shù)n,m。 第二行有n個(gè)字母(‘R’或’B’),每個(gè)第i個(gè)字母表示PH試紙第i段的顏色。 接下來m行,第i行有一個(gè)大寫字母 ci(‘R’或’B’)和一個(gè)正整數(shù)qi ,用空格隔開,表示查詢顏色ci 第qi 次出現(xiàn)的位置。輸出描述:
共m行,第i行一個(gè)整數(shù),表示查詢結(jié)果,若顏色ci出現(xiàn)次數(shù)少于qi次,則輸出-1,否則輸出顏色qi第ci次出現(xiàn)的位置。示例1
輸入
復(fù)制
2 2 RB R 1 B 1輸出
復(fù)制
1 2示例2
輸入
復(fù)制
2 2 BB R 1 B 2輸出
復(fù)制
-1 2示例3
輸入
復(fù)制
3 3 BRB B 1 B 2 R 1輸出
復(fù)制
1 3 2備注:
對(duì)于100%的測(cè)試數(shù)據(jù): 1 ≤ n, m ≤ 1000000 所有輸入數(shù)據(jù)不超過1000000。 數(shù)據(jù)量較大,注意使用更快的輸入輸出方式。解題報(bào)告:
? 直接維護(hù)兩個(gè)前綴和,復(fù)雜度O(m)。
AC代碼:
#include<cstdio> #include<iostream> #include<algorithm> #include<queue> #include<map> #include<vector> #include<set> #include<string> #include<cmath> #include<cstring> #define ll long long #define pb push_back #define pm make_pair using namespace std; const int MAX = 2e6 + 5; int n,m; char s[MAX]; int R[MAX],B[MAX],r,b; int main() {cin>>n>>m;scanf("%s",s+1);getchar();memset(R,-1,sizeof R);memset(B,-1,sizeof B);for(int i = 1; i<=n; i++) {if(s[i] == 'R') R[++r] = i;if(s[i] == 'B') B[++b] = i;}char ch[4];int x;while(m--) {scanf("%s%d",ch,&x);if(ch[0] == 'R') printf("%d\n",R[x]);else printf("%d\n",B[x]);}return 0 ; }進(jìn)一步擴(kuò)展:如果是1e5種顏色呢?? 答:那也很簡(jiǎn)單啊1e5個(gè)vector就完事了。?
再一步擴(kuò)展:如果兩種顏色帶修改呢?? 答:那就建兩棵線段樹,對(duì)應(yīng)位置如果是當(dāng)前線段樹維護(hù)的顏色, 那就置為1 ,然后查詢第k大。
終極擴(kuò)展:那如果是1e5種顏色帶修改呢?? 答:那就主席樹。每種顏色都建一棵4*n這么大的線段樹,因?yàn)橥瑯?gòu)?所以壓縮到一棵主席樹里,查詢就找該顏色對(duì)應(yīng)的線段樹?在線段樹上二分,線段樹上維護(hù)的是?是該樹維護(hù)的顏色則該點(diǎn)記為1?其他顏色記為0。(%%%syt)
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: *【HDU - 6201】transac
- 下一篇: 【牛客 - 368B】选点(dfs序,L