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

题解:[JXOI2017] 加法

题目传送门

题意分析

注意到「最小值尽可能的大」。

一般对于这种最值的最值的问题,都可以套一层二分答案。——xxy

考虑二分答案。

二分答案的原因

一直没想明白,直到我在模拟赛上打了 $\text{1.5h}$ 建了 $3$ 棵线段树维护的贪心假了后,终于想起来二分答案。

最值具有单调性,最值的最值同样有。

例如最大值 $x$ 的最小值 $y$,我们二分最大值 $x$,则当 $x\geq y$ 的时候,其性质不变。

那么我们本质上就是将最优性问题转化为了判定性问题——而这往往更为容易。

二分序列最小值 \(\textit{mid}\)。考虑如何高效判断 \(\textit{mid}\) 是否可行。容易得到 \(A_i\) 需要加上多少个 \(a\),即:

\[\textit{cnt}_i=\left\lceil\dfrac{\textit{mid}-A_i}{a}\right\rceil=\left\lfloor\dfrac{\textit{mid}-A_i+a-1}{a}\right\rfloor \]

之后就是判断能否选择至多 \(k\) 条线段,每条线段 \([l,r]\) 都使 \(\forall i\in[l,r],\textit{cnt}_i\leftarrow \textit{cnt}_i-1\),最终能否使得所有 \(\textit{cnt}_i\) 都小于等于 \(0\)

因为这是判定性问题,所有点都要被满足,因此直接扫一遍。

考虑覆盖了 \(i\) 的线段,我们期望优先选择一条尽可能往右覆盖的线段,这样更优(左边已经覆盖完了)。因此用堆维护右端点,扫到一个左端点就将其加入堆。

时间复杂度 \(\mathcal O(n\log n\log V)\),其中 \(V\) 为值域。

AC 代码

//#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
#include<set>
using namespace std;
constexpr const int N=2e5,M=2e5;
vector<int>R[N+1];
int n,m,k,add,a[N+1];
struct segTree{struct node{int l,r;int max,tag;}t[N<<2|1];void up(int p){t[p].max=t[p<<1].max+t[p<<1|1].max;}void build(int p,int l,int r,int a[]){t[p]={l,r};if(l==r){t[p].max=a[l];return;}int mid=l+r>>1;build(p<<1,l,mid,a);build(p<<1|1,mid+1,r,a);up(p);}void down(int p){if(t[p].tag){t[p<<1].max+=t[p].tag;t[p<<1].tag+=t[p].tag;t[p<<1|1].max+=t[p].tag;t[p<<1|1].tag+=t[p].tag;t[p].tag=0;}}void add(int p,int l,int r,int x){if(l<=t[p].l&&t[p].r<=r){t[p].max+=x;t[p].tag+=x;return;}down(p);if(l<=t[p<<1].r){add(p<<1,l,r,x);}if(t[p<<1|1].l<=r){add(p<<1|1,l,r,x);}up(p);}int query(int p,int x){if(t[p].l==t[p].r){return t[p].max;}down(p);if(x<=t[p<<1].r){return query(p<<1,x);}else{return query(p<<1|1,x);}}
}t;
bool check(int mid){static int cnt[N+1];for(int i=1;i<=n;i++){cnt[i]=(mid-a[i]+add-1)/add;}t.build(1,1,n,cnt);priority_queue<int>q;int pl=0;for(int i=1;i<=n;i++){for(int r:R[i]){q.push(r);}while(t.query(1,i)>0){if(!q.size()){return false;}int r=q.top();if(r<i||pl>=k){return false;}q.pop();pl++;t.add(1,1,r,-1);}}return true;
}
int main(){/*freopen("test.in","r",stdin);freopen("test.out","w",stdout);*/ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T;cin>>T;while(T--){cin>>n>>m>>k>>add;for(int i=1;i<=n;i++){cin>>a[i];R[i].resize(0);}for(int i=1;i<=m;i++){int l,r;cin>>l>>r;R[l].push_back(r);}int l=a[1],ans=-1;for(int i=2;i<=n;i++){l=min(l,a[i]);}int r=l+k*add;while(l<=r){int mid=l+r>>1;if(check(mid)){ans=mid;l=mid+1;}else{r=mid-1;}}cout<<ans<<'\n';}cout.flush();/*fclose(stdin);fclose(stdout);*/return 0;
}
http://www.jsqmd.com/news/366183/

相关文章:

  • AI图像修复零门槛:开源工具如何让每个人都能轻松焕新照片
  • 2026年厦门空运物流公司推荐:国内知名企业服务优势评测,涵盖跨境电商与冷链场景痛点 - 十大品牌推荐
  • 玻璃钢编绕拉挤管道加工厂哪个靠谱,快来看看这些企业 - 工业品牌热点
  • 2026年北京装修公司推荐:居家与商业场景深度评测,解决质量与环保核心痛点并附排名 - 十大品牌推荐
  • lazarus实现拖放文件
  • 2026年IT培训机构推荐:转行就业场景深度评测,破解技能脱节与高薪痛点并附排名 - 十大品牌推荐
  • 2026年四川房屋加固公司推荐榜:聚焦专业实力与裂缝修复处理能力的TOP10企业 - 深度智识库
  • 2026年靠谱的GEO专业企业盘点,价格大比拼 - myqiye
  • 深聊哈尔滨汽车故障维修推荐,权威汽车维修品牌多少钱 - 工业品网
  • 2026年广州惠州等地易斯拉国际物流,清关能力安全性与中亚服务谁能评个分 - myqiye
  • Mac输入设备增强方案选型:LinearMouse与BetterTouchTool深度技术对比
  • 2026年北京装修公司推荐:基于多场景实测评价,针对预算超支与延期痛点精准指南 - 十大品牌推荐
  • 煤矿传送带上异物矸石螺钉铁片检测数据集VOC+YOLO格式384张4类别
  • 如何为不同房型选装修公司?2026年北京装修公司全面评测与推荐,直击延期与增项痛点 - 十大品牌推荐
  • 江苏专业玻璃钢编绕拉挤管道生产厂家怎么收费,排行榜揭晓 - 工业推荐榜
  • 婚礼策划公司哪家强?2026年北京婚礼策划公司推荐排名,解决定制化与性价比痛点 - 十大品牌推荐
  • 为猫择粮的科学视角:回归专性肉食动物的营养本质 - 品牌之家
  • 进阶指南:在 DWS 中利用 PL/Python 解锁数据库无限可能
  • 一文讲透|8个AI论文工具测评:本科生毕业论文写作全攻略
  • Yuzu模拟器精准获取指南:高效下载与版本管理策略
  • 故障ID: OMO-2026-001
  • UniHacker深度研究:许可证验证机制实现原理与应用场景指南
  • 2026年北京婚礼策划公司推荐:长期服务稳定性评测,针对统筹协调与应急痛点指南 - 十大品牌推荐
  • 【论文学习】城市尺度BIPV如何缓解“热岛-制冷-废热“的正反馈循环?
  • 深入解析:【数论】最大公因数 (gcd) 与最小公倍数 (lcm)
  • ping命令工作流程
  • 3个颠覆认知的零代码AI创新应用:从想法到落地的完整指南
  • 讲故事”到“开火”:2026 年我见过最靠谱的几种 AI 落地模式
  • 2026年工程管理系统推荐:聚焦施工协同与成本痛点,多场景实测深度评价 - 十大品牌推荐
  • 【UMEP第3.6期】预处理器 Pre-Processor 总结:城市土地利用