解析:
直接处理出前缀和,然后就可以用O(1)的复杂度,离线查询。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100005;
int sum[N];
bool vis[10];
bool judge(int num) {
memset(vis, false, sizeof(vis));
while(num) {
if(vis[num%10]) return false;
vis[num%10] = true;
num /= 10;
}
return true;
}
void init() {
sum[0] = 0;
for(int i = 0; i < N; i++) {
sum[i] = judge(i) + sum[i-1];
}
}
int query(int ql, int qr) {
return sum[qr] - sum[ql-1];
}
int main() {
init();
int T;
scanf("%d", &T);
int ql, qr;
while(T--) {
scanf("%d%d", &ql, &qr);
printf("%d\n", query(ql, qr));
}
return 0;
}
本文介绍了一种通过预处理前缀和来实现O(1)复杂度的离线查询方法,并提供了一个具体的C++代码实现。该方法适用于需要快速查询区间内特定数值的问题,通过预先计算并存储每个位置的累积值,可以显著提高查询效率。

被折叠的 条评论
为什么被折叠?



