比赛 防止颓废的小练习v0.1 评测结果 AAAAAAAAAA
题目名称 选择客栈 最终得分 100
用户昵称 Rapiz 运行时间 0.580 s
代码语言 C++ 内存使用 58.28 MiB
提交时间 2016-10-17 13:05:34
显示代码纯文本
#include<cstdio>
#include<algorithm>
#define file(x) "hotel."#x
using std::min;
const int MAXN=2e5+10,MAXC=55;
typedef long long ll;
int a[MAXN],n,k,p,c[20][MAXN],at[MAXN][MAXC];
ll ans;
ll query(int i,int j){
	int l=j-i+1,r=0;
	while((1<<r+1)<=l) r++;
	return min(c[r][i],c[r][j-(1<<r)+1]);
}
int main(){
	freopen(file(in),"r",stdin);
	freopen(file(out),"w",stdout);
	scanf("%d%d%d",&n,&k,&p);
	for(int i=1;i<=n;i++) {
		scanf("%d%d",&a[i],&c[0][i]);
	}
	for(int t=1;t<20;t++){
		for(int i=1;i+(1<<t)-1<=n;i++) {
			c[t][i]=min(c[t-1][i],c[t-1][i+(1<<t-1)]);
		}
	}
	for(int i=n;i;i--){
		for(int j=0;j<k;j++) {
			at[i][j]=at[i+1][j]+(a[i]==j);
		}
	}
	for(int i=1;i<=n;i++){
		int l=i+1,r=n+1,mid;
		while(l<r){
			mid=l+r>>1;
			if(query(i,mid)<=p) r=mid;
			else l=mid+1;
		}
		if(l==n+1) continue;
		ans+=at[l][a[i]];
	}
	printf("%lld",ans);
}