問題 A: 統計-----------------------------------------------思維(離散+二分)模板

題目描述
給定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。

解析:
我們將所有數離散化,用vector存每個數所對應的下標

然後二分查詢詢問區間即在該數下保存的下標二分查詢是否存在

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+1000;
ll a[N],val;
vector<ll> v[N];
map<ll,ll> mp;
int n,l,r,m;
int cnt;
bool check(int l,int r,int x)
{
	return upper_bound(v[x].begin(),v[x].end(),r)-lower_bound(v[x].begin(),v[x].end(),l);
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++) 
	{
		scanf("%lld",&a[i]);
		if(!mp[a[i]]) mp[a[i]]=++cnt; //離散化
		v[mp[a[i]]].push_back(i);	
	}
	scanf("%d",&m);
	string s;
	while(m--)
	{
		scanf("%d %d %lld",&l,&r,&val);
		if(check(l,r,mp[val])) s+='1';
		else s+='0';
	}
	cout<<s<<endl;
 } 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章