当前位置: 首页 > news >正文

CF862E 题解

题目传送门

题目给的定义 \(f_j = \Big|\sum\limits_{i=1}^{n}(-1)^{i-1}\times(a_i - b_{i+j})\Big|\),题目要求求 \(f_j\) 的最小值。

这个式子我们拆一下。如果不考虑绝对值的话,就可以拆成

\[\sum\limits_{i=1}^{n}(-1)^{i-1}\times a_i - \sum\limits_{i=1}^{n}(-1)^{i-1}\times b_{i+j} \]

把负号转为正号,就变成了

\[\sum\limits_{i=1}^{n}(-1)^{i-1}\times a_i + \sum\limits_{i=1}^{n}(-1)^i\times b_{i+j} \]

可以看出前半部分不随 \(j\) 的变化而变化,右半部分 \(b\) 数组不因为询问而改变,可以预处理所有可能的 \(j\) 时右边式子的值。这里可以用前缀和来实现。

左边的初始答案也可以预处理算出来。右边可以预处理得到必须减去 \(m - n + 1\) 个数的一个,要求减去后答案绝对值最小。我们不妨将这 \(m - n + 1\) 个数排序,设左边初始答案为 \(ans\),那么只需要在这些数里面查询最接近 \(-ans\) 的数就行了。可以用二分来解决该问题。(细节:如果和我一样直接用 \(\text{lower}\_\text{bound}\) 函数的话,要注意有些数是相同的,返回的值两边都不一定是最优答案,只需要再调用一次 \(\text{upper}\_\text{bound}\) 就行了。)

修改时对答案的贡献也是好算的。如果修改的长度是偶数,那么正负抵消,所以左半部分答案和原先一样;否则,判断端点是够作正贡献。如果是,那么左半部分答案为之前答案加上 \(x\);否则为之前答案减去 \(x\)。然后每次操作后再二分查找答案就行了。

Code

#include <iostream>
#include <algorithm>
#include <cmath>
#define int long long
using namespace std;
int t,n,m,A,B,k,q;
int a[200005],b[200005],c[200005],cnt,sum[200005],ans,l,r,cd;
int get_min(int x)//二分查找右半部分取下标x附近时的最小答案
{int p = 1e18;if(x > 1 && abs(c[x - 1] + ans) < abs(p))p = abs(c[x - 1] + ans);if(abs(c[x] + ans) < abs(p))p = abs(c[x] + ans);if(x < cnt && abs(c[x + 1] + ans) < abs(p))p = abs(c[x + 1] + ans);return p;
} 
signed main()
{cin >> n >> m >> q;for(int i = 1;i <= n;i ++){cin >> a[i];if(i % 2)ans += a[i];else ans -= a[i];}for(int i = 1;i <= m;i ++){cin >> b[i];if(i % 2)sum[i] = sum[i - 1] - b[i];//前缀和else sum[i] = sum[i - 1] + b[i];}for(int i = n;i <= m;i ++)//计算出备选的右半贡献{if((n - i + 1) % 2)c[++cnt] = sum[i] - sum[i - n];else c[++cnt] = - sum[i] + sum[i - n];}sort(c + 1,c + cnt + 1);c[0] = c[cnt + 1] = 1e18;int ds = lower_bound(c + 1,c + cnt + 1,- ans) - c;int dt = upper_bound(c + 1,c + cnt + 1,- ans) - c;cout << min(get_min(ds),get_min(dt)) << '\n';for(int i = 1;i <= q;i ++){cin >> l >> r >> cd;if((r - l + 1) % 2)//操作{if(l % 2)ans += cd;else ans -= cd;}int ds = lower_bound(c + 1,c + cnt + 1,- ans) - c;int dt = upper_bound(c + 1,c + cnt + 1,- ans) - c;cout << min(get_min(ds),get_min(dt)) << '\n';}
}
http://www.jsqmd.com/news/481119/

相关文章:

  • 学霸同款!普遍认可的AI论文网站 —— 千笔·专业论文写作工具
  • 2026年酒泉戈壁徒步公司口碑排名,靠谱品牌有哪些 - 工业品网
  • 一文讲透|全行业通用降AIGC工具 —— 千笔
  • 深圳区域起重机安装资质办理,亨通靠谱服务排名前列 - myqiye
  • 交稿前一晚!9个降AI率软件降AIGC网站评测对比,全行业通用必看
  • 南京高功率密度电源定制,2026年这些源头厂家有优势,氢能源车载直流转换器/辅助应急电源,高功率密度电源品牌哪个好 - 品牌推荐师
  • 说说上海专业的企业法律在线咨询机构,哪家口碑更好 - 工业品牌热点
  • 毕业论文神器 8个一键生成论文工具:开源免费测评+高效写作推荐
  • 直线轴承品牌新动态:2026年值得关注的品牌,直线轴承排行榜技术领航者深度解析 - 品牌推荐师
  • 深度解析:2026年国内伺服印刷机定制服务哪家强?,目前耐用的伺服印刷机哪家权威优质品牌选购指南 - 品牌推荐师
  • 赶deadline必备 AI论文写作软件 千笔AI VS 灵感ai
  • 爬虫测试:单元测试与集成测试实践
  • 交稿前一晚!千笔AI,开源免费降重神器
  • 服务器部署爬虫:Supervisor 进程守护
  • 好用还专业!8个降AI率工具全领域适配测评与推荐
  • 国产智驾SoC全面突围:从低算力替代到高算力量产的技术跃迁
  • 数字化研发核心引擎:2026年主流需求管理软件竞争格局与趋势解析 - 品牌推荐
  • 汽车与机器人领域的“全脑”计算平台引领者
  • 第二部分 主体间性与DOS三值纠缠:关系哲学的双重维度
  • 第四部分 公共领域与星图舞台:多元协商的空间条件
  • 华为OD机考双机位C卷 - 打印机队列 (Java)
  • AtCoder Weekday Contest 0022 Beta题解(AWC 0022 Beta A-E)
  • 华为OD机考双机位C卷 - 执行任务赚积分 (Java)
  • 真空气密连接器好用品牌有哪些,低温气密性同轴连接器推荐 - 工业品网
  • 华为OD机考双机位C卷 - 挑选字符串 (Java)
  • 讲讲航拍无人机模拟器APP品牌,傲睿尔科技产品值得了解 - myqiye
  • 华为OD机考双机位C卷 - 挑选宝石 (Java)
  • 盘点2026年上海新房室内设计公司,铂空间设计排名靠前 - 工业品网
  • 探讨2026年浙江诚信的Geo优化机构,哪家服务更靠谱 - mypinpai
  • 聊聊宁波推荐手工西服定制哪家好,这些品牌值得关注 - myqiye