Compare commits

...

2 Commits

Author SHA1 Message Date
f8f53e255d feat: 添加P1616和P5020题解代码
实现动态规划解法,分别解决背包问题和货币系统问题
2025-09-06 17:09:45 +08:00
5746fd6999 feat: 添加基于稀疏表的区间最值查询功能
实现一个使用稀疏表数据结构的算法,用于高效查询区间最大值和最小值
包含预处理阶段构建稀疏表和查询阶段处理多个区间查询
2025-09-06 14:02:24 +08:00
3 changed files with 114 additions and 0 deletions

24
src/9/6/P1616.cpp Normal file
View File

@ -0,0 +1,24 @@
#include <algorithm>
#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 t,m;
std::cin>>t>>m;
std::vector<ll> dp(t+1);
for(ll i=1;i<=m;i++){
ll w,v;
std::cin>>w>>v;
for(ll j=w;j<=t;j++){
dp[j]=std::max(dp[j],dp[j-w]+v);
}
}
std::cout<<dp[t]<<"\n";
}

43
src/9/6/P5020.cpp Normal file
View File

@ -0,0 +1,43 @@
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <istream>
#include <vector>
using ll = int64_t;
ll t;
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>t;
std::vector<ll> a;
std::vector<bool> dp;
while(t--){
ll n;
std::cin>>n;
ll ans=n;
a.clear();
dp.clear();
a.resize(n+1);
for(ll i=1;i<=n;i++){
std::cin>>a[i];
}
std::sort(a.begin()+1,a.begin()+1+n);
dp.resize(a[n]+1);
dp[0]=true;
for(ll i=1;i<=n;i++){
if(dp[a[i]]){
ans--;
continue;
}
for(ll j=a[i];j<=a[n];j++){
dp[j]=dp[j]|dp[j-a[i]];
}
}
std::cout<<ans<<"\n";
}
}

47
src/9/6/libre10123.cpp Normal file
View File

@ -0,0 +1,47 @@
#include <algorithm>
#include <cmath>
#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,q;
std::cin>>n>>q;
std::vector<ll> lg(n+1);
for(ll i=2;i<=n;i++){
lg[i]=lg[i/2]+1;
// printf("lg2[%lld]=%lld\n",i,lg[i]);
}
std::vector<std::vector<ll>> bmax(n+1,std::vector<ll>(lg[n]+1)),bmin(n+1,std::vector<ll>(lg[n]+1));
for(ll i=1;i<=n;i++){
std::cin>>bmax[i][0];
bmin[i][0]=bmax[i][0];
}
for(ll j=1;j<=lg[n];j++){
for(ll i=1;i+(1ll<<(j-1))<=n;i++){
bmax[i][j]=std::max(
bmax[i][j-1],
bmax[i+(1ll<<(j-1))][j-1]
);
bmin[i][j]=std::min(
bmin[i][j-1],
bmin[i+(1ll<<(j-1))][j-1]
);
}
}
while(q--){
ll l,r;
std::cin>>l>>r;
ll range=r-l+1;
ll max = std::max(bmax[l][lg[range]],bmax[r-(1ll<<(lg[range]))+1][lg[range]]);
ll min = std::min(bmin[l][lg[range]],bmin[r-(1ll<<(lg[range]))+1][lg[range]]);
// printf("max=%lld, min=%lld\n",max,min);
std::cout<<max-min<<"\n";
}
}