扫描线学习笔记·持续更新
扫描线学习笔记·持续更新
P10814 【模板】离线二维数点 - 洛谷
solve:
枚举 a[i] 过程中将其加入树状数组 f[i] 维护小于等于 i 的数的个数,然后我们可以用前缀和的思路解决询问。
code:
#include<bits/stdc++.h>
using namespace std;
constexpr int mod=998244353,N=2e6+10;
#define pii pair<int,int>
#define piii pair<pii,int>
#define fi first
#define se second
int n,m,a[N],f[N],ans[N];
vector<piii>g[N];
int lb(int x){return (-x)&x;}
void add(int k){
for(;k<=n;k+=lb(k)) f[k]++;
}
int q(int k){
int tmp=0;
for(;k>=1;k-=lb(k)) tmp+=f[k];
return tmp;
}
void init(){
cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[i];
for(int i=1;i<=m;++i){
int l,r,x;
cin>>l>>r>>x;
g[l-1].push_back({{x,-1},i});
g[r].push_back({{x,1},i});
}
}
void solve(){
for(int i=1;i<=n;++i){
add(a[i]);
for(auto v:g[i]) ans[v.se]+=v.fi.se*q(v.fi.fi);
}
for(int i=1;i<=m;++i)cout<<ans[i]<<"\n";
}
int main(){
ios::sync_with_stdio(0),cin.tie(0);
init();
solve();
return 0;
}

浙公网安备 33010602011771号