题目:http://www.luogu.org/problem/show?pid=1311#
分析:
用sum[i][j]记录前i个中颜色为j的有多少个,可以O(nk)预处理出来。
当w[i]<=p时,i对答案的贡献就是sum[i-1][color[i]]。
当w[i]>p时,i对答案的贡献就是sum[last][color[i]],last是最后一个满足w[i]<=p的元素序号。
总时间复杂度是O(n+nk)
代码:
#include <cstdio>
#include <algorithm>
using namespace std;
const int Tmax=200005,Tmax2=55;
int n,m,p,sum[Tmax][Tmax2],w[Tmax],f,last,color[Tmax];
void work()
{
int i;
for(i=1;i<=n;i++)
{
if(w[i]<=p)
{
last=i;
f+=sum[i-1][color[i]];
}
else f+=sum[last][color[i]];
}
printf("%d",f);
return;
}
int main()
{
int i,j,a,b;
scanf("%d%d%d",&n,&m,&p);
for(i=1;i<=n;i++)
{
scanf("%d%d",&a,&b);
w[i]=b;
color[i]=a;
sum[i][a]++;
for(j=0;j<m;j++)
sum[i][j]+=sum[i-1][j];
}
work();
return 0;
}