统计

统计
【问题描述】
给定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
#include
#include
#include
#include
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 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;
}




你可能感兴趣的:(审题,hash)