题目
分析
还是要先分析
如果按照常规做法我们肯定是先把相同色调的先放在一起然后在全枚举算出结果
但很明显会超时
所以我们不能这样子做
首先我们先预处理
算出前i个中当前颜色的总个数
将每个颜色最后出现的位置记录下来
结果其实就是等于
将每一个co[f[i]][a[i]]加在一起
代码
1 #include<iostream>
2 using namespace std;
3 int a[200001];
4 int co[200001][60];
5 int f[200001];
6 int main ()
7 {
8 int n,k,p;
9 cin>>n>>k>>p;
10 int b;
11 for (int i=1;i<=n;i++)
12 {
13 cin>>a[i]>>b;
14 for(int j=0;j<k;j++) //记录前i中共出现多少次同种颜色
15 {
16 co[i][j]=co[i-1][j];
17 }
18 co[i][a[i]]++;
19 if (b<=p)
20 f[i]=i;
21 else
22 f[i]=f[i-1];
23 }
24 int ans=0;
25 for (int i=1;i<=n;i++)
26 {
27 ans+=co[f[i]][a[i]];
28 if (f[i]==i) ans--;
29 }
30 cout<<ans;
31 }