【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)
生活随笔
收集整理的這篇文章主要介紹了
【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題干:
鏈接:https://ac.nowcoder.com/acm/contest/157/C
來源:牛客網
題目描述
????PH試紙,是一種檢測酸堿度的試紙,試紙紅色為酸性,藍色為堿性。
????HtBest有一個PH試紙,試紙被分成了n段,每一段都可以被染色成紅色或者藍色,WHZ在試紙的每一段上都染為一種顏色,HtBest有m個詢問,對于每個詢問,Ta想知道某種顏色第qi次在什么地方出現。
輸入描述:
第一行有兩個正整數n,m。 第二行有n個字母(‘R’或’B’),每個第i個字母表示PH試紙第i段的顏色。 接下來m行,第i行有一個大寫字母 ci(‘R’或’B’)和一個正整數qi ,用空格隔開,表示查詢顏色ci 第qi 次出現的位置。輸出描述:
共m行,第i行一個整數,表示查詢結果,若顏色ci出現次數少于qi次,則輸出-1,否則輸出顏色qi第ci次出現的位置。示例1
輸入
復制
2 2 RB R 1 B 1輸出
復制
1 2示例2
輸入
復制
2 2 BB R 1 B 2輸出
復制
-1 2示例3
輸入
復制
3 3 BRB B 1 B 2 R 1輸出
復制
1 3 2備注:
對于100%的測試數據: 1 ≤ n, m ≤ 1000000 所有輸入數據不超過1000000。 數據量較大,注意使用更快的輸入輸出方式。解題報告:
? 直接維護兩個前綴和,復雜度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 ; }進一步擴展:如果是1e5種顏色呢?? 答:那也很簡單啊1e5個vector就完事了。?
再一步擴展:如果兩種顏色帶修改呢?? 答:那就建兩棵線段樹,對應位置如果是當前線段樹維護的顏色, 那就置為1 ,然后查詢第k大。
終極擴展:那如果是1e5種顏色帶修改呢?? 答:那就主席樹。每種顏色都建一棵4*n這么大的線段樹,因為同構?所以壓縮到一棵主席樹里,查詢就找該顏色對應的線段樹?在線段樹上二分,線段樹上維護的是?是該樹維護的顏色則該點記為1?其他顏色記為0。(%%%syt)
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的【牛客 - 157C】PH试纸(前缀和,或权值线段树,主席树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: *【HDU - 6201】transac
- 下一篇: 【牛客 - 368B】选点(dfs序,L