NOIP2011提高组(选择客栈)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NOIP2011提高组(选择客栈)相关的知识,希望对你有一定的参考价值。

题目链接:http://codevs.cn/problem/1135/

题目大意:中文题。。。就不解释了

题目思路:看了其他巨巨的blog写的,dp思路

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <stack>
#include <cctype>
#include <queue>
#include <string>
#include <vector>
#include <set>
#include <map>
#include <climits>
#define lson root<<1,l,mid
#define rson root<<1|1,mid+1,r
#define fi first
#define se second
#define ping(x,y) ((x-y)*(x-y))
#define mst(x,y) memset(x,y,sizeof(x))
using namespace std;
#define gamma 0.5772156649015328606065120 //欧拉常数
#define MOD 100000007
#define inf 0x3f3f3f3f
#define N 200010
#define maxn 10001000
typedef long long LL;
typedef pair<int,int> PII;

int f[N];  ///保存第从1~i-1个客栈消费小于p的最大的客栈编号
int color[N]; ///保存1~i-1个客栈和i个客栈颜色相同的客栈个数
int c2[N]; ///c2[i]=1~i-1号客栈中与第i号客栈色调相同,且到第i号旅馆路上存在最低消费不大于p的客栈的客栈数目
int r[N];  ///第1~i-1的客栈中色调与i客栈相同的最大的编号
int _max[N]; ///maxc[i]=之前所有客栈中,色调为i的最大编号

int main()
{
    int a,i,n,m,p,b;
    scanf("%d%d%d",&n,&m,&p);
    for(i=1; i<=n; ++i)
    {
        scanf("%d%d",&a,&b);
        r[i]=_max[a];
        if(b<=p) f[i]=i;
        else f[i]=f[i-1];
        if(f[i]<r[i])c2[i]=c2[r[i]];
        else c2[i]=color[a];
        _max[a]=i;
        ++color[a];
    }
    int ans=0;
    for(i=1; i<=n; ++i) ans+=c2[i];
    cout<<ans<<endl;
    return 0;
}

原文地址:传送门

以上是关于NOIP2011提高组(选择客栈)的主要内容,如果未能解决你的问题,请参考以下文章

NOIP2011提高组 选择客栈

Noip2011 提高组 选择客栈

洛谷P1311 [NOIP2011提高组Day1T2] 选择客栈

NOIP提高组 2011

2011noip提高选择客栈

2011提高组选择客栈