问题 A: 统计(二分+set+un_map)

问题 A: 统计(二分+set+un_map)

题目描述
给定n个数,有m个询问。每次询问, Alice想知道区间内[l, r]内是否出现过xi这个数。
输入
第一行一个整数n。
第二行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。

思路:题目意思挺简单的,统计每个数出现的位置,放进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; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值