为了不断优化推荐效果,今日头条每天要存储和处理海量数据。假设有这样一种场景:我们对用户按照它们的注册时间先后来标号,对于一类文章,每个用户都有不同的喜好值,我们会想知道某一段时间内注册的用户(标号相连的一批用户)中,有多少用户对这类文章喜好值为k。因为一些特殊的原因,不会出现一个查询的用户区间完全覆盖另一个查询的用户区间(不存在L1<=L2<=R2<=R1)。
输入描述:
输入: 第1行为n代表用户的个数 第2行为n个整数,第i个代表用户标号为i的用户对某类文章的喜好度 第3行为一个正整数q代表查询的组数 第4行到第(3+q)行,每行包含3个整数l,r,k代表一组查询,即标号为l<=i<=r的用户中对这类文章喜好值为k的用户的个数。 数据范围n <= 300000,q<=300000 k是整型
输出描述:
输出:一共q行,每行一个整数代表喜好值为k的用户的个数
输入例子1:
5
1 2 3 3 5
3
1 2 1
2 4 5
3 5 3
输出例子1:
1
0
2
例子说明1:
样例解释:
有5个用户,喜好值为分别为1、2、3、3、5,
第一组询问对于标号[1,2]的用户喜好值为1的用户的个数是1
第二组询问对于标号[2,4]的用户喜好值为5的用户的个数是0
第三组询问对于标号[3,5]的用户喜好值为3的用户的个数是2
思路:很裸的分块
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<ctime>
#include<string>
#include<stack>
#include<deque>
#include<queue>
#include<list>
#include<set>
#include<map>
#include<cstdio>
#include<limits.h>
#define MOD 1000000007
#define fir first
#define sec second
#define fin freopen("/home/ios666/Documents/input.txt", "r", stdin)
#define fout freopen("/home/ios666/Documents/output.txt", "w", stdout)
#define mes(x, m) memset(x, m, sizeof(x))
#define Pii pair<int, int>
#define Pll pair<ll, ll>
#define INF 1e9+7
#define inf 0x3f3f3f3f
#define Pi 4.0*atan(1.0)
#define lowbit(x) (x&(-x))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
typedef long long ll;
typedef unsigned long long ull;
const double eps = 1e-9;
const int mod = 1000000000+7;
const int maxn = 1000;
using namespace std;
inline int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,k;
int v[500005],b[500005];
vector<int> ve[505];
int query(int l,int r,int x){
int ans=0;
for(int i=l;i<=min(b[l]*k,r);++i){
if(v[i]==x){
++ans;
}
}
if(b[l]!=b[r]){
for(int i=(b[r]-1)*k+1;i<=r;++i){
if(v[i]==x){
++ans;
}
}
}
for(int i=b[l]+1;i<=b[r]-1;++i){
ans+=upper_bound(ve[i].begin(),ve[i].end(),x)-lower_bound(ve[i].begin(),ve[i].end(),x);
}
return ans;
}
int main(){
n=read(),k=sqrt(n);
for(int i=1;i<=n;++i){
v[i]=read();
}
for(int i=1;i<=n;++i){
b[i]=(i-1)/k+1;
ve[b[i]].push_back(v[i]);
}
for(int i=1;i<=b[n];++i){
sort(ve[i].begin(),ve[i].end());
}
int q=read();
for(int i=1;i<=q;++i){
int l=read(),r=read(),c=read();
printf("%d\n",query(l,r,c));
}
return 0;
}