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

题解:AtCoder AT_awc0087_e Change of Assigned Interval

本文分享的必刷题目是从蓝桥云课洛谷AcWing等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。

欢迎大家订阅我的专栏:算法题解:C++与Python实现!

附上汇总贴:算法竞赛备考冲刺必刷题(C++) | 汇总


【题目来源】

AtCoder:E - Change of Assigned Interval

【题目描述】

Takahashi and Aoki manageN NNtasks numbered from1 11toN NN.

For thei ii-th task, a symbolS i S_iSirepresenting the person in charge and a work costP i P_iPiare recorded. WhenS i S_iSiisT, the person in charge is Takahashi; when it isA, the person in charge is Aoki.

Here,flippingthe assignment means changingTtoAandAtoT.

Q QQqueries are given.

For thej jj-th query, you may perform the following operation at most once. It is also permitted to not perform the operation.

Operation:Choose a pair of integers( l , r ) (l, r)(l,r)satisfyingL j ≤ l ≤ r ≤ R j L_j \leq l \leq r \leq R_jLjlrRj, and flip the assignment of all tasks from thel ll-th to ther rr-th.

Consider the total work cost of tasks assigned to Aoki (A) among the tasks from theL j L_jLj-th to theR j R_jRj-th after the operation (or if no operation is performed). Find the minimum value of this total when the operation is chosen optimally.

Each query is independent. An operation in one query does not affect the original assignment/cost information or other queries.

高桥和青木管理着编号从1 11N NNN NN个任务。

对于第i ii个任务,记录了表示负责人符号S i S_iSi和工作成本P i P_iPi。当S i S_iSiT时,负责人是高桥;当S i S_iSiA时,负责人是青木。

这里,翻转分配意味着将T改为A,将A改为T

给定Q QQ个查询。

对于第j jj个查询,你最多可以执行一次以下操作。也可以选择不执行操作。

操作:选择一对满足L j ≤ l ≤ r ≤ R j L_j \leq l \leq r \leq R_jLjlrRj的整数( l , r ) (l, r)(l,r),并翻转从第l ll个到第r rr个所有任务的分配。

考虑操作后(或不执行操作时),从第L j L_jLj个到第R j R_jRj个任务中分配给青木(A)的任务的总工作成本。求当操作选择最优时,这个总和的最小值。

每个查询是独立的。一个查询中的操作不会影响原始的分配/成本信息或其他查询。

【输入】

N NNQ QQ
S 1 S_1S1P 1 P_1P1
S 2 S_2S2P 2 P_2P2
⋮ \vdots
S N S_NSNP N P_NPN
L 1 L_1L1R 1 R_1R1
L 2 L_2L2R 2 R_2R2
⋮ \vdots
L Q L_QLQR Q R_QRQ

  • The first line containsN NN, the number of tasks, andQ QQ, the number of queries, separated by a space.
  • The followingN NNlines give the information of each task.
  • Thei ii-th of these lines containsS i S_iSi, representing the person in charge of thei ii-th task, andP i P_iPi, representing the work cost of that task, separated by a space.
  • S i S_iSiisTorA.
  • The followingQ QQlines give the information of the queries.
  • Thej jj-th of these lines contains the left endpointL j L_jLjand right endpointR j R_jRjof the range for thej jj-th query, separated by a space.

【输出】

PrintQ QQlines.

On thej jj-th line, print the answer to thej jj-th query as an integer.

【输入样例】

5 4 A 3 T 5 A 2 T 4 A 6 1 5 2 4 3 3 4 5

【输出样例】

5 0 0 0

【算法标签】

#线段树

【代码详解】

#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=100005;// 定义最大数组长度intn,q;// 数组长度n,查询次数qintsa[N],v[N];// 前缀和数组sa,线段树基础数组vintw[N];// 备用数组(此处未使用)structNode{intl,r;// 区间左右端点intsum,pre,suf,best;// 区间和、最大前缀和、最大后缀和、最大子段和}tr[N*4];// 线段树数组voidpushup(intu)// 向上更新节点信息{tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;// 区间和tr[u].pre=max(tr[u<<1].pre,tr[u<<1].sum+tr[u<<1|1].pre);// 最大前缀和tr[u].suf=max(tr[u<<1|1].suf,tr[u<<1|1].sum+tr[u<<1].suf);// 最大后缀和tr[u].best=max({tr[u<<1].best,tr[u<<1|1].best,tr[u<<1].suf+tr[u<<1|1].pre});// 最大子段和}voidbuild(intu,intl,intr)// 建立线段树{if(l==r)// 叶子节点tr[u]={l,r,v[l],v[l],v[l],v[l]};// 初始化else// 非叶子节点{tr[u]={l,r};// 初始化区间intmid=l+r>>1;// 计算中点build(u<<1,l,mid),build(u<<1|1,mid+1,r);// 递归建树pushup(u);// 更新节点信息}}Nodequery(intu,intl,intr)// 区间查询{if(tr[u].l>=l&&tr[u].r<=r)// 完全包含returntr[u];// 直接返回else// 不完全包含{intmid=tr[u].l+tr[u].r>>1;// 计算中点if(r<=mid)returnquery(u<<1,l,r);// 完全在左子树if(l>mid)returnquery(u<<1|1,l,r);// 完全在右子树Node left=query(u<<1,l,r);// 查询左子树Node right=query(u<<1|1,l,r);// 查询右子树Node res;// 合并结果res.sum=left.sum+right.sum;// 区间和res.pre=max(left.pre,left.sum+right.pre);// 最大前缀和res.suf=max(right.suf,right.sum+left.suf);// 最大后缀和res.best=max({left.best,right.best,left.suf+right.pre});// 最大子段和returnres;// 返回结果}}signedmain()// 主函数{cin>>n>>q;// 输入数组长度和查询次数for(inti=1;i<=n;i++)// 读取数组元素{chars;// 操作类型intp;// 操作数值cin>>s>>p;// 输入操作类型和数值sa[i]=sa[i-1]+(s=='A'?p:0);// 计算前缀和(只累加A类型的值)v[i]=(s=='A'?p:-p);// 设置线段树基础数组值}build(1,1,n);// 建立线段树while(q--)// 处理每个查询{intl,r;// 查询区间cin>>l>>r;// 输入查询区间intbase=sa[r]-sa[l-1];// 计算基础值(区间内A类型值的和)Node res=query(1,l,r);// 查询区间信息intmaxReduce=max(0LL,res.best);// 最大可减少值cout<<base-maxReduce<<endl;// 输出结果}return0;// 程序正常结束}

【运行结果】

5 4 A 3 T 5 A 2 T 4 A 6 1 5 5 2 4 0 3 3 0 4 5 0
http://www.cnnetsun.cn/news/2865949.html

相关文章:

  • Go语言为何成为TVA的“血液循环系统”(5)
  • 3个简单步骤:用WinDiskWriter在Mac上制作Windows启动U盘
  • 从聊天室到股票行情:用JavaScript手把手实现一个可配置的轮询/长轮询通用工具库
  • 3ds Max特效师必看:手把手教你用tyFlow的MAXScript接口读取粒子数据做二次开发
  • 3步解密微信数据:从技术合规到数据安全的实践指南
  • CryptoJS 4.2.0:如何在JavaScript项目中实现专业级数据加密保护
  • 看完就会:盘点2026年人气爆表的的AI论文网站
  • 告别复制粘贴!在ESP32 IDF5.0中优雅地集成ST7735S驱动(附完整组件源码)
  • 围棋对局图像自动解析工具:Python+OpenCV识别棋盘网格与黑白子位置
  • 191.手机刷机底层原理详解|GPT分区表、AVB签名链、efuse熔断机制深度解析
  • AI 电动纺织面料切割机智能功率 MOSFET 完整选型方案
  • BMS开发避坑指南:卡尔曼滤波SOC估算中的参数整定与工程化陷阱
  • Zotero Style完全手册:颠覆性可视化插件让文献管理焕然一新
  • 用原生JS和Canvas实现一个带完整历史记录的涂鸦板(附撤销/恢复核心代码)
  • 告别VGA大块头!用FPGA驱动ST7789V小屏,做个便携示波器界面(附Verilog源码)
  • 基于LSTM与模糊C均值的股票价格波动区间预测工具(含ETF多源数据+完整Python工程)
  • 让浏览器新标签页真正属于你:NewTab Redirect的个性化革命
  • 手把手教你为LVGL项目制作专属字体库:从TTF到.bin文件的完整工具链(附Python GUI工具)
  • Thanos告警管理架构深度解析:构建企业级分布式告警系统
  • BoilR完整指南:如何一键整合所有游戏平台到Steam库
  • 从干皮到油皮全适配:高性价比粉底液横评对比
  • 5分钟用AI看懂足球:体育视频智能分析实战指南
  • 别再只调API了!手把手带你用PyTorch从零复现GPT-1的Transformer Decoder结构
  • S12XDBG硬件调试模块:从总线窥探到精准触发的嵌入式调试实战
  • 用Proteus和51单片机做个数据保险箱:手把手教你SPI EEPROM断电记忆(附完整代码)
  • 别光收藏了!用Python 3分钟自动生成ASCII码对照表(附完整代码)
  • 7天掌握开源三维重建:从照片到专业模型的完整路径
  • 洛雪音乐音源配置终极指南:三步打造你的个人无损音乐库
  • 避开美赛大坑:为什么你的灰色关联度分析可能不被认可?从原理到应用的深度解读
  • 【计算机毕业设计案例】基于jspm网上书店管理系统(程序+文档+讲解+定制)