记录编号 |
323904 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOIP 2011]选择客栈 |
最终得分 |
100 |
用户昵称 |
Rapiz |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.512 s |
提交时间 |
2016-10-17 14:02:16 |
内存使用 |
58.28 MiB |
显示代码纯文本
#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);
}