【BZOJ3638】k-Maximum Subsequence Sum

该博客介绍了如何运用费用流的方法解决BZOJ3638题目的k-Maximum Subsequence Sum问题。文章通过线段树模拟费用流,并实现了查找区间最大子序列和与区间取反的功能,整体时间复杂度为O(MKLogN)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目链接】

【五倍经验链接】

【思路要点】

  • 容易发现一种可行的费用流建边。
  • 用线段树模拟上述费用流,我们需要实现查找区间最大子段和和区间取反。
  • 时间复杂度 O(MKLogN) O ( M K L o g N )

【代码】


#include<bits/stdc++.h>

using namespace std;

#define MAXN  200005

template <typename T> void read(T &x) {
  x = 0; int f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - '0';
  x *= f;
}
struct Segment_Tree {
  struct info {
      int lmax, rmax, smax;
      int lmin, rmin, smin;
      int lmaxpos, lminpos;
      int rmaxpos, rminpos;
      int smaxl, sminl;
      int smaxr, sminr;
      int sum;
  };
  info merge(info a, info b) {
      info ans;
      ans.sum = a.sum + b.sum;
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值