ABC248的D
  • 板块学术版
  • 楼主Engulf
  • 当前回复5
  • 已保存回复5
  • 发布时间2022/4/17 21:17
  • 上次更新2023/10/28 03:25:20
查看原帖
ABC248的D
482728
Engulf楼主2022/4/17 21:17

这题尝试用分块做TLE了,不是常数的问题

n,q2×105n,q\le 2\times 10^5 时限 2s 感觉不会T的吧

#include <bits/stdc++.h>
#define endl '\n'
using namespace std;

const int N = 2e5+10;
int n,q;
int L[N],R[N],pos[N],block,num;
int a[N],d[N];
void build(){
	block=sqrt(n);
	num=n/block;
	if(n%block)num++;
	for(int i=1;i<=num;i++){
		L[i]=(i-1)*block+1;
		R[i]=i*block;
	}
	R[num]=n;
	for(int i=1;i<=n;i++)pos[i]=(i-1)/block+1;
	for(int i=1;i<=num;i++){
		sort(d+L[i],d+R[i]+1);
	}
}
int query(int l,int r,int k){
	int x=pos[l],y=pos[r];
	if(x==y){
		int ans=0;
		for(int i=l;i<=r;i++)if(a[i]==k)ans++;
		return ans;
	}
	int ans=0;
	for(int i=l;i<=R[x];i++){
		if(a[i]==k)ans++;
	}
	for(int i=x+1;i<=y-1;i++){
		ans+=(upper_bound(d+L[i],d+R[i]+1,k)-lower_bound(d+L[i],d+R[i]+1,k));
	}
	for(int i=L[y];i<=r;i++){
		if(a[i]==k)ans++;
	}
	return ans;
}

int main(){
	ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i],d[i]=a[i];
	cin>>q;
	while(q--){
		int l,r,x;
		cin>>l>>r>>x;
		cout<<query(l,r,x)<<endl;
	}
	return 0;
}
2022/4/17 21:17
加载中...