This commit is contained in:
Zengtudor 2025-08-18 11:50:38 +08:00
parent 4b54a56f4f
commit f9b5a94c12
2 changed files with 125 additions and 0 deletions

View File

@ -0,0 +1,53 @@
#include <bits/stdc++.h>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
long long maxSumTrionic(vector<int>& nums) {
vector<int> dp(nums.size());
cout<<dp[0]<<',';
int ans = INT_MIN;
for(int i=1;i<nums.size();i++){
if(nums[i]<=nums[i-1]){
dp[i]=dp[i-1];
}else{
dp[i]=i;
}
cout<<dp[i]<<',';
}
cout<<'\n';
for(int i=1;i<nums.size()-1;i++){
cout<<"i:"<<i<<'\n';
if(i+1<nums.size() && dp[i+1]==dp[i])continue;
if(dp[i]==i)continue;
if(dp[i]==0 || dp[i+1]==dp[i])continue;
int l = dp[i],r=i+1;
int lsum = nums[dp[i]-1],rsum=nums[i+1],rbegin=nums[i+1];
while(l-1>0 && (l==1||dp[l-1]!=dp[l-2]) && nums[l]>0){
l--;
lsum+=nums[l];
cout<<"l:"<<l<<'\n';
}
while(r<nums.size()-1 && (r==nums.size()-1||dp[r]!=dp[r+1])){
r++;
rsum+=nums[r];
cout<<"r:"<<r<<'\n';
}
int mid = 0;
for(int j=dp[i];j<=i;j++){
mid+=nums[j];
}
ans=max(ans,mid+lsum+max(rsum,rbegin));
cout<<mid+lsum+max(rsum,rbegin)<<'\n';
}
return ans;
}
};
int main(){
Solution s;
vector<int> v={1,4,2,7};
cout<<s.maxSumTrionic(v)<<'\n';
}

72
src/8/18/segtree_add.cpp Normal file
View File

@ -0,0 +1,72 @@
#include <algorithm>
#include <cstdint>
#include <iostream>
#include <limits>
#include <vector>
using ll = int64_t;
std::vector<ll> t;
std::vector<ll> nums;
ll create(ll l, ll r, ll idx) {
if (l == r) {
t[idx] = nums[l];
return t[idx];
}
ll mid = (l + r) / 2;
t[idx] = std::min(create(l, mid, 2 * idx + 1), create(mid + 1, r, 2 * idx + 2));
return t[idx];
}
void update(ll l, ll r, ll idx, ll pos, ll val) {
if (l == r) {
t[idx] = val;
return;
}
ll mid = (l + r) / 2;
if (pos <= mid) {
update(l, mid, 2 * idx + 1, pos, val);
} else {
update(mid + 1, r, 2 * idx + 2, pos, val);
}
t[idx] = std::min(t[2 * idx + 1], t[2 * idx + 2]);
}
ll query(ll cur,ll ql,ll qr,ll l,ll r){
if(qr<l || r<ql)return std::numeric_limits<ll>::max();
if(ql<=l && r<=qr)return t[cur];
ll mid = (l+r)/2;
return std::min(
query(cur*2+1, ql, qr, l, mid),
query(cur*2+2, ql, qr, mid+1, r)
);
}
int main(){
// 区间min 单点修改
ll n;
std::cin>>n;
t.resize(4*n);
nums.resize(n);
for(ll i=0; i<n; i++){
std::cin>>nums[i];
}
create(0, n - 1, 0);
ll q;
std::cin>>q;
while(q--){
ll idx, val;
std::cin>>idx>>val;
idx--;
update(0, n - 1, 0, idx, val);
std::cout << t[0] << "\n";
}
std::cin>>q;
while(q--){
ll l,r;
std::cin>>l>>r;
l++,r++;
std::cout<<query(0, l, r, 0, n-1)<<'\n';
}
}