题解-luogu-p1311选择客栈

题目链接

现在我随机@一个人 这个人必须帮我写题目概括

@gzn7264

这篇题解就不在洛谷博客上发布了。

首先枚举点对的右端点。显而易见,合法的左端点必须满足:

  1. 左端点与右端点颜色相同
  2. 左端点到右端点之间必须存在至少一个客栈,使得其费用小于等于 $P$

第二个条件有点麻烦,我们可以稍微转化一下。记 $l_i$ 为客栈 $i$ 的左侧第一个费用小于等于 $P$ 的客栈编号。那么,以 $i$ 为右端点的情况下,左端点的可选位置即为 $1-l_i$ 种所有颜色与客栈 $i$ 相同的客栈个数。

由于本题卡空间,必须采用滚动数组。数组 $s_i$ 记录颜色 $i$ 的出现次数,数组 $c_i$ 记录颜色 $i$ 的可选左端点个数。每次更新答案时,加上 $c_{color}$ 即可。

在示例代码中,可选的左端点包括其本身,因此当 $money\le P$ 时存在重复计算,答案减一。

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
using namespace std;
long long ans;
int N, K, P;
int c[50], s[50];
int main() {
scanf("%d%d%d", &N, &K, &P);
for (register int i = 1; i <= N; ++i) {
int color, money;
scanf("%d%d", &color, &money);
s[color]++;
if (money <= P)
for (register int j = 0; j < K; ++j)
c[j] = s[j];
ans += c[color] - (money <= P);
}
printf("%I64d", ans);
return 0;
}

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×