尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CF182C Optimal Sum

CF182C Optimal Sum
📅 发布时间:2026/6/20 17:26:59

题目传送门

贪心、权值线段树

题意

给定一个数字 \(len\) 和一个长度为 \(n(n\le 10^5)\) 的数组 \(a\),你最多可以执行 \(k\) 次操作 \(a_i \leftarrow -a_i\),请你最大化

\[\max \limits_{i\in [1,n]} \bigl | \sum_{j=0}^{j=len-1} a_{i+j} \bigr | \]

题解

我们只有两种方向:让绝对值里东西尽可能小或者尽可能大,因此我们只有两种选择,选 \(k\) 个最小或最大的数反转。

我们通过一遍扫描过去统计答案,每次会有单点修改,现在我们要找一个可以维护区间前 \(k\) 大的数据结构,支持单点修改。

这里容易想到用离散化加权值线段树的方法,相当于一个桶,维护权值为 \(x\) 的数的个数和权值区间和。

这里可以用结构体开两颗一模一样的线段树,一个只存正数,一个只存负数。时间复杂度 \(O(n \log n)\)。

代码

#include <bits/stdc++.h>
#define int long long using namespace std;
const int N=1e5+5;int n,len,k;
struct node{int val,sgn,id;
}a[N]; 
int w[N],tot;struct SegTree{#define ls k<<1#define rs k<<1|1 #define mid (l+r>>1)int sum[N<<2],cnt[N<<2];inline void pushup(int k){sum[k]=sum[ls]+sum[rs];cnt[k]=cnt[ls]+cnt[rs];}void add(int k,int l,int r,const int& x){if(l==r){sum[k]+=w[x];cnt[k]++;return;}if(x<=mid) add(ls,l,mid,x);else add(rs,mid+1,r,x);pushup(k);}void del(int k,int l,int r,const int& x){if(l==r){sum[k]-=w[x];cnt[k]--;return;}if(x<=mid) del(ls,l,mid,x);else del(rs,mid+1,r,x);pushup(k);}int query(int k,int l,int r,int x){if(!x) return 0;if(l==r) return w[l]*min(x,cnt[k]);if(cnt[rs]>=x) return query(rs,mid+1,r,x);return sum[rs]+query(ls,l,mid,x-cnt[rs]);}#undef ls #undef rs#undef mid
}tr[2];signed main(){cin.tie(nullptr)->sync_with_stdio(false);cin>>n>>len;for(int i=1;i<=n;i++){cin>>a[i].val;if(a[i].val<0) a[i].sgn=-1;else a[i].sgn=1;a[i].val=abs(a[i].val);w[++tot]=a[i].val;}cin>>k;sort(w+1,w+tot+1);tot=unique(w+1,w+tot+1)-w-1;for(int i=1;i<=n;i++) a[i].id=lower_bound(w+1,w+tot+1,a[i].val)-w;int s0=0,s1=0;for(int i=1;i<=len;i++){if(a[i].sgn==1) s0+=a[i].val,tr[0].add(1,1,tot,a[i].id);else s1+=a[i].val,tr[1].add(1,1,tot,a[i].id);}int ans=max(2*tr[0].query(1,1,tot,k)+s1-s0,2*tr[1].query(1,1,tot,k)+s0-s1);for(int i=2;i+len-1<=n;i++){if(a[i-1].sgn==1) tr[0].del(1,1,tot,a[i-1].id),s0-=a[i-1].val;else 			  tr[1].del(1,1,tot,a[i-1].id),s1-=a[i-1].val;if(a[i+len-1].sgn==1) tr[0].add(1,1,tot,a[i+len-1].id),s0+=a[i+len-1].val;else				  tr[1].add(1,1,tot,a[i+len-1].id),s1+=a[i+len-1].val;ans=max({ans,max(2*tr[0].query(1,1,tot,k)+s1-s0,2*tr[1].query(1,1,tot,k)+s0-s1)});}cout<<ans;return 0;
}

本文来自博客园,作者:_AzureSky,转载请注明原文链接:https://www.cnblogs.com/-AzureSky-/p/19101371

相关新闻

  • HTB UNIV CTF 24 Armaxix靶场漏洞链:命令注入与账户接管实战
  • PyTorch Weight Decay 技术指南
  • js获取浏览器语言,以及调用谷歌翻译api翻译成相应的内容

最新新闻

  • 西安回收黄金门店推荐|2026本地靠谱奢品黄金回收商户测评优选 - 名奢变现站
  • 昇腾GE SubgraphInput构造函数与析构函数
  • 2026 安庆|中考两三百分意向 3+2 五年制专业,2026 官方简章发布,咨询号码多少 - 我叫小周
  • 2027帝国理工申请中介选型攻略 - 资讯速览
  • 找浙江 GEO 服务商别踩坑:2026 最新 4 类 GEO 概念澄清 + 6 家机构实力对比详解 - 936品牌测评网
  • 2026西安带父母怎么玩?慢节奏不累行程|纯玩导游推荐+避坑全攻略 - 旅行分享

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号