题解 P1311 选择客栈
这道体原来是校内模拟赛的时候做的,一开始确实没什么思路,只想到
如果两个点
举个例子(有、、丑)
但是这样似乎会有重复的问题,而且复杂度还是没有优化。考虑如果能一遍扫完,观察数据,发现颜色种类
需要注意当这个点的
代码:
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 2E5 + 10;
int N,K,P;
int a[MAXN],b;
int clr[MAXN][60],nxt[MAXN];
long long ans = 0;
int main() {
scanf("%d%d%d",&N,&K,&P);
for (register int i = 1; i <= N; i++) {
scanf("%d%d",&a[i],&b);
for (register int j = 0; j < K; j++) {
clr[i][j] = clr[i - 1][j]; //每种颜色的前缀和
}
clr[i][a[i]]++;
if (b <= P) { //指针,指向上一个满足条件的点
nxt[i] = i;
}
else {
nxt[i] = nxt[i - 1];
}
}
for (register int i = 1; i <= N; i++) {
if (nxt[i] == i) {
ans += clr[i - 1][a[i]];
}
else {
ans += clr[nxt[i]][a[i]];
}
}
printf("%lld",ans);
return 0;
}
完结撒花qwq