统计

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




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值