feat: 添加P7992和libre10115两个算法问题的解决方案

添加了两个新的算法实现文件:
1. P7992.cpp - 实现了一个基于前缀和的统计问题解决方案
2. libre10115.cpp - 实现了一个使用二叉索引树(Fenwick Tree)的区间查询问题解决方案
This commit is contained in:
Zengtudor 2025-09-04 15:02:33 +08:00
parent cc3380434c
commit b6e0880148
2 changed files with 85 additions and 0 deletions

33
src/9/4/P7992.cpp Normal file
View File

@ -0,0 +1,33 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
ll n,m;
std::cin>>n>>m;
std::vector<ll> va(m+1),vb(m+1);
for(ll i=1;i<=n;i++){
ll a,b;
std::cin>>a>>b;
va[a]++;
vb[b]++;
}
std::vector<ll> pre(2*m+2);
for(ll i=0;i<=m;i++){
for(ll j=0;j<=m;j++){
pre[i+j]+=va[i]*va[j];
pre[i+j+1]-=vb[i]*vb[j];
}
}
ll ans=0;
for(ll i=0;i<=2*m;i++){
ans+=pre[i];
std::cout<<ans<<'\n';
}
}

52
src/9/4/libre10115.cpp Normal file
View File

@ -0,0 +1,52 @@
#include <cstdint>
#include <ios>
#include <iostream>
#include <vector>
using ll = int64_t;
struct BT{
const ll size;
std::vector<ll> t;
static inline ll lb(ll n){
return n&(-n);
}
BT(ll size):size(++size),t(size+1){
}
inline void upd(ll idx,ll add){
while(idx<=size){
t[idx]+=add;
idx+=lb(idx);
}
}
inline ll get(ll idx){
ll res=0;
while(idx){
res+=t[idx];
idx-=lb(idx);
}
return res;
}
};
int main(){
std::ios_base::sync_with_stdio(false);
std::cin.tie(nullptr);
ll n,m;
std::cin>>n>>m;
BT s(n),e(n);
for(ll i=1;i<=m;i++){
ll k,l,r;
std::cin>>k>>l>>r;
if(k==1){
s.upd(l, 1);
e.upd(r, 1);
}else{
ll nans=
s.get(r) - e.get(l-1);
std::cout<<nans<<"\n";
}
}
}