NOIP2011 D1T2 选择客栈

用时:20 min  时间复杂度:O(kn)

还算是比较简单的一道题,先看部分分,发现暴力可以拿50。暴力的做法是枚举每个合法咖啡店左右两端相同颜色的客栈。

考虑优化,由于本题中每个合法点都对答案造成影响,很容易想到维护某种前缀和。

而从输入过程中每个点的影响,无论该点是否合法,该点上的客栈都对答案做出贡献(可为 0 ),需要知道的是离该点最近的合法点的位置前与该点颜色相同的点数

那么维护这两个值就可以了,详细见代码:

 

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 200100
using namespace std;
int n,k,p;
int col[maxn][60],hf[maxn];
int read()
{
       int ans=0,op=1;char ch=getchar();
       while(ch<'0'||ch>'9'){if(ch=='-')op=-1;ch=getchar();}
       while(ch>='0'&&ch<='9'){ans=ans*10+ch-'0';ch=getchar();}
       return ans*op;
}
int main()
{
       n=read();k=read();p=read();
       int ans=0;
       for(int i=1;i<=n;i++)
       {
              int color=read();int price=read();
              for(int j=0;j<k;j++)
                     col[i][j]=col[i-1][j];
              col[i][color]++;
              if(price<=p) hf[i]=i,ans--;
              else hf[i]=hf[i-1];
              ans+=col[hf[i]][color];
       }
       printf("%d\n",ans);
       return 0;
}

 

posted @ 2019-05-29 22:25  .Terena  阅读(107)  评论(0编辑  收藏  举报