统计
【问题描述】
给定N个数,有M个询问。每次询问一段区间内有没有出现过Xi这个数。
【输入格式】
第一行一个整数N。
第二行N个正整数表示给定的N个数。
第三行一个整数M。
以下M行每行三个整数li,ri和Xi;表示询问区间是[li, ri],询问数字是Xi。
【输出格式】
对于每一次询问,输出一个字符。0表示没出现,1表示出现了。
【样例输入输出】
statistic.in statistic.out
5
1234567 666666 3141593 666666 4343434
5
1 5 3141593
1 5 578202
2 4 666666
4 4 7135610
1 1 1234567 10101
【数据说明】
40%的数据满足:N≤1000,M≤1000
100%的数据满足:N≤105,M≤105,Xi≤109
这道题用hash就可以解决了,但是可能会出现重复的数...
所以hash找到数的时候不一定合法,要继续往下找,原来代码因为找到数后直接返回WA了。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int MAXN = 1E5;
const int hn = 199999;
typedef long long LL;
typedef double DB;
inline int get(){
char c;
while((c = getchar()) < '0' || c > '9');
int cnt = c - '0';
while((c = getchar()) >= '0' && c <= '9') cnt = cnt * 10 + c - '0';
return cnt;
}
int N,M;
struct data{
int num,val;
data(int num,int val): num(num),val(val){
}
};
vector<data> hs[hn + 10];
inline void hash(int x,int num){
int k = x % hn;
hs[k].push_back(data(num,x));
return;
}
inline bool query(int x,int l,int r){
int k = x % hn;
for(int i = 0; i < hs[k].size(); i ++){
if(x == hs[k][i].val){
if(l <= hs[k][i].num && hs[k][i].num <= r) return true;
}
}
return false;
}
int main(){
#ifdef lwy
freopen("3.txt","r",stdin);
#else
freopen("statistic.in","r",stdin);
freopen("statistic.out","w",stdout);
#endif
N = get();
for(int i = 1; i <= N; i ++){
int a = get(); hash(a,i);
}
M = get();
while(M --){
int l,r,q;
l = get(); r = get(); q = get();
if(query(q,l,r)) printf("1");
else printf("0");
}
return 0;
}