藍橋杯每日一題:第一周周四哞叫時間
疑惑:如何把復雜度控制在Q(n),怎么枚舉a和b,longlong的形式又該怎么輸入(考慮用string)
思路:枚舉倒數第二個b前面有多少個a
這是一種經典的實現方法,需要掌握,用數的值做數的下標,其實就和用字母序號做下標一樣,left[x]表示當前數左邊值等于x的數的個數,right[x]則相反
注意特別的含義,left[x]=0,當前就是從右往左遍歷到的最后一個x了,
#include<iostream>
#include<cstring>
using namespace std;
const int N=1e6 + 5;
typedef long long int LL;
LL res;//因為res最大為N的平方,超int了
int l[N],r[N],w[N],cnt;//cnt表示一共有多少個不同的數
int main(){int n;cin>>n;for(int i=1;i<=n;++i){cin>>w[i];if(++l[w[i]]==1) cnt++;}for(int i=n;i>=1;--i){int x=w[i];r[x]++;l[x]--;if(l[x]==0) cnt--;//即不一樣的數就減少了一個if(r[x]==2) {res+=cnt;if(l[x]>0) res-=1;}//剪掉的1就是左邊剩下的一個b,因為只有不一樣的數字才會被記到cnt里,左邊無論有幾個b,在cnt里左邊不同的數都只有1}cout<<res<<endl;
}