NOIP2011 选择客栈

来源:互联网 发布:maven 自动构建 java 编辑:程序博客网 时间:2024/04/27 19:26

题目: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;}
0 0
原创粉丝点击