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提高组(选择客栈)的主要内容,如果未能解决你的问题,请参考以下文章