问题 A: 统计(二分+set+un_map)
题目描述
给定n个数,有m个询问。每次询问, Alice想知道区间内[l, r]内是否出现过xi这个数。
输入
第一行一个整数n。
第二行n个正整数ai。
第三行一个整数m。
接下来m行每行三个整数li, ri和xi, 表示询问区间为[li, ri], 询问数字为xi。
第二行n个正整数ai。
第三行一个整数m。
接下来m行每行三个整数li, ri和xi, 表示询问区间为[li, ri], 询问数字为xi。
输出
对于每个询问,输出一个字符。‘0’表示没出现,‘1’表示出现了。
样例输入 Copy
5
1234567 666666 3141593 666666 4343434
5
1 5 3141593
1 5 578202
2 4 666666
4 4 7135610
1 1 1234567
样例输出 Copy
10101
提示
对于50%的数据, n <= 1000, m <= 1000。
对于100%的数据, n <= 1e5, m <= 1e5, ai, xi <= 1e9。
对于100%的数据, n <= 1e5, m <= 1e5, ai, xi <= 1e9。
思路:题目意思挺简单的,统计每个数出现的位置,放进set.
询问的时候直接set里二分查找大于等于l的数,如果小于r,说明区间里存在。否则不存在。记得开始时往set里推inf和-1.
#pragma comment(linker, "/STACK:1024000000,1024000000")
#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
#define rep(i , a , b) for(register int i=(a);i<=(b);i++)
#define per(i , a , b) for(register int i=(a);i>=(b);i--)
#define ms(s) memset(s, 0, sizeof(s))
#define squ(x) (x)*(x)
#define first fi
#define second se
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int , int> pi;
typedef unordered_map<int,int> un_map;
typedef priority_queue<int> prque;
template<class T>
inline void read (T &x) {
x = 0;
int sign = 1;
char c = getchar ();
while (c < '0' || c > '9') {
if ( c == '-' ) sign = - 1;
c = getchar ();
}
while (c >= '0' && c <= '9') {
x = x * 10 + c - '0';
c = getchar ();
}
x = x * sign;
}
const int maxn = 3e5 + 10;
const int inf = 1e9;
const ll INF = ll(1e18);
const int mod = 998244353;
const double PI = acos(-1);
//#define LOCAL
int n;
unordered_map<ll,set<int> >mp;
set<int>::iterator it;
void solve() {
rep(i,1,n) {
ll x;
read(x);
if(!mp.count(x)) {
mp[x].insert(-1);
mp[x].insert(inf);
}
mp[x].insert(i);
}
int q;
read(q);
string ans="";
while(q--) {
ll l,r,x;
read(l);read(r);read(x);
if(!mp.count(x)) {
ans=ans+'0';
continue;
}
it = mp[x].lower_bound(l);
int y = *it;
if(y<=r) {
ans+='1';
}
else ans+='0';
}
cout<<ans<<endl;
}
int main(int argc, char * argv[])
{
#ifdef LOCAL
freopen("in.txt", "r", stdin);
freopen("out.txt", "w", stdout);
#endif
while(~scanf("%d",&n)) {
solve();
}
return 0;
}