记录编号 468729 评测结果 AAAAAAAAAA
题目名称 [NOIP 2011]选择客栈 最终得分 100
用户昵称 Gravatar爆零自动机 是否通过 通过
代码语言 C++ 运行时间 0.287 s
提交时间 2017-11-01 21:30:38 内存使用 41.51 MiB
显示代码纯文本
#include <iostream>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <cstdio>
#include <map>
#include <cstdlib>
#include <climits>
using namespace std;

#define maxn 200000+3
#define maxm 50+3

int n,m,p;
int cost[maxn];
int kz[maxm][maxn];
int clr,ans;

int find(int i,int l,int r,int key);//lower_pound()

int main()
{
	freopen("hotel.in","r",stdin);
	freopen("hotel.out","w",stdout);
	
	scanf("%d%d%d",&n,&m,&p);
	for(int i=1; i<=n; i++)
	{
		scanf("%d%d",&clr,&cost[i]);
		kz[clr][0]++;//统计个数
		kz[clr][kz[clr][0]]=i; 
	}
	
	for(int i=0; i<=m; i++)
	{
		for(int j=1; j<kz[i][0]; j++)
		{
			for(int k=kz[i][j]; k<=kz[i][kz[i][0]]; k++)
			{
				if(cost[k]<=p)
				{
					if(kz[i][j]==k)
					{
						ans+=kz[i][0]-j;
					}
					else
					{
						int t=find(i,j,kz[i][0],k);
						ans+=kz[i][0]-t+1;
					}
					break;
				}
			}
		}
	}
	
	printf("%d\n",ans);
	
	return 0;
}
int find(int i,int l,int r,int key)
{
	while(l<=r)
	{
		int mid=(l+r)/2;
		if(kz[i][mid]>=key)
		{
			r=mid-1;
		}
		else
		{
			l=mid+1;
		}
	}
	return l;
}