noip 2011 选择客栈

我感觉这是一道还挺有意思的题目 

我中午一直在头昏脑涨的情况下努力地想,终于有一点儿思路:

那就是如果我们找到一个位置数字小于p,那么这个点前面所有和它颜色相同的点都可以加进方案中,而前面所有和它颜色相同的点则是可以O(nk)也就大约是10^7预处理过去的。

这样,我们顺便维护一个prin数组,prin[i]表示的是i这一位前面(包括i)第一个消费价格比p小的位置,这样做的理由就是所有这个位置往前的与此时访问到的点的颜色相同的点是可以和这个点构成一个方案的;

所以最后统计答案的时候就显得轻而易举啦,访问到一个点,就是看这个点前面(包括他)最早的一个点消费价格小于p,从这里往前所有和它颜色相同的都可以使答案增加,而我们又英明的预处理,太强了!!!

最后还有一个小坑,就是如果这个点消费价格小于p,那他自己也会被算,与题意不符,答案要减去1!!!

葱太强了!!

hyq结构体!!!

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,p;
struct hyq{
    int co,pr;
}a[200010];
int c[200010][55],prin[201000];
int main(){
    cin>>n>>k>>p ;
    for(int i=1;i<=n;i++){
        cin>>a[i].co>>a[i].pr;
        for(int j=0;j<k;j++){
            c[i][j]=c[i-1][j];
        }
        c[i][a[i].co]++;
        if(a[i].pr<=p){
            prin[i]=i;
        }
        else prin[i]=prin[i-1];
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans+=c[prin[i]][a[i].co];
        if(prin[i]==i) ans--;
    }
    cout<<ans<<endl;
}

猜你喜欢

转载自blog.csdn.net/weixin_42759194/article/details/81570680