feat: 添加两个算法题目解决方案

添加P10131.cpp和mn1009t2.cpp两个算法题目的解决方案代码。P10131.cpp解决相邻元素匹配问题,mn1009t2.cpp实现基于双端队列的优化算法。
This commit is contained in:
Zengtudor 2025-10-10 16:06:16 +08:00
parent 385380934e
commit 8e8776d58b
2 changed files with 83 additions and 0 deletions

42
src/10/10/P10131.cpp Normal file
View File

@ -0,0 +1,42 @@
#include <cstdint>
#include <iostream>
#include <istream>
#include <set>
using ll = int64_t;
#define sl static inline
const ll maxn = 1e5+5;
ll T,n,h[maxn];
std::set<ll> s;
sl void solve(){
std::cin>>n;
for(ll i=1;i<=n;i++)std::cin>>h[i];
s.clear();
for(ll i=2;i<=n;i++){
if(h[i-1]==h[i] && s.find(h[i])==s.end()){
s.insert(h[i]);
}
}
for(ll i=3;i<=n;i++){
if(h[i]==h[i-2] && s.find(h[i])==s.end()){
s.insert(h[i]);
}
}
if(s.empty()){
std::cout<<"-1\n";
return;
}
for(const ll i:s){
std::cout<<i<<" ";
}
std::cout<<"\n";
}
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>T;
while(T--)solve();
}

41
src/10/10/mn1009t2.cpp Normal file
View File

@ -0,0 +1,41 @@
#include <cstdint>
#include <deque>
#include <iostream>
#include <istream>
#include <utility>
using ll = int64_t;
const ll maxn = 2e6+5;
ll n,m,v,d[maxn],p[maxn],ans=0;
std::deque<std::pair<ll, ll>> dq; // 价钱,剩余
int main(){
std::iostream::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cin>>n>>m>>v;
for(ll i=1;i<=n;i++)std::cin>>d[i];
for(ll i=1;i<=n;i++)std::cin>>p[i];
for(ll i=1;i<=n;i++){
const ll jdnp = p[i]-m*i;
while(dq.size() && dq.back().first >= jdnp)dq.pop_back();
dq.emplace_back(jdnp, d[i]+v);
while(d[i]){
if(dq.front().second > d[i]){
ans+=(dq.front().first+i*m)*d[i];
d[i]=0;
}else if(dq.front().second == d[i]){
ans+=(dq.front().first+i*m)*d[i];
d[i]=0;
dq.pop_front();
}else{
ans+=(dq.front().first+i*m)*dq.front().second;
d[i]-=dq.front().second;
dq.pop_front();
}
}
dq.back().second=v;
}
std::cout<<ans<<"\n"; //DEBUGGING
}