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

*题解:P1712 [NOI2016] 区间

原题链接

解析

笔者原本的思路是按照左端点排序考虑交点,但是发现无法快速处理出极差;还想过了不考虑交点直接做。

为什么不再回溯一层呢?

由于要求长度的极差,所以考虑将区间按照长度排序。按照这个顺序依次覆盖每个区间对应的点,当某个点被覆盖的次数 \(\ge m\) 时统计答案,统计时维护一个指针 \(pos\) 指向最早加入的区间,利用 \(len_i-len_{pos}\) 更新答案并消除第 \(pos\) 个区间的贡献,然后右移 \(pos\),直到没有一个点被覆盖次数 \(\ge m\)

可以利用线段树来维护区间最大覆盖次数。

需要离散化。

时间复杂度 \(O(n\log n)\)

代码

注意判无解。

/*
*/
#include <bits/stdc++.h>
#define ls(x) ((x) << 1)
#define rs(x) (((x) << 1) | 1)
#define mid ((l + r) >> 1)
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e5 + 5,M = 2e5 + 5,mod = 998244353;
pii s[N];
int len[N],mx[N << 1 << 2],tag[N << 1 << 2];
bool cmp(pii a,pii b){return a.second - a.first < b.second - b.first;
}
void push_up(int p){mx[p] = max(mx[ls(p)],mx[rs(p)]);
}
void add_tag(int p,int k){tag[p] += k;mx[p] += k;
}
void push_down(int p){if(!tag[p]) return;add_tag(ls(p),tag[p]);add_tag(rs(p),tag[p]);tag[p] = 0;
}
void modi(int p,int l,int r,int L,int R,int k){if(l > R || r < L) return;if(l >= L && r <= R){add_tag(p,k);return;}push_down(p);modi(ls(p),l,mid,L,R,k),modi(rs(p),mid + 1,r,L,R,k);push_up(p);
}
int main(){ios::sync_with_stdio(false);cin.tie(0);
//	freopen("in.txt","r",stdin);
//	freopen("out1.txt","w",stdout);int n,m;cin>>n>>m;vector<int> v;for(int i=1;i<=n;i++){cin>>s[i].first>>s[i].second;	v.push_back(s[i].first);v.push_back(s[i].second);}sort(v.begin(),v.end());v.erase(unique(v.begin(),v.end()),v.end());int siz = v.size();sort(s + 1,s + n + 1,cmp);int l = 1;int res = 2e9;for(int i=1;i<=n;i++){len[i] = s[i].second - s[i].first;s[i].first = lower_bound(v.begin(),v.end(),s[i].first) - v.begin() + 1;s[i].second = lower_bound(v.begin(),v.end(),s[i].second) - v.begin() + 1;modi(1,1,siz,s[i].first,s[i].second,1);while(mx[1] >= m){res = min(res,len[i] - len[l]);modi(1,1,siz,s[l].first,s[l].second,-1);l++;}}cout<<(res == 2e9 ? -1 : res);return 0;
}
http://www.jsqmd.com/news/35317/

相关文章:

  • Day 20
  • 考试(高二上)
  • rustfs一键脚本配置方式
  • Allegro:如何手动在PCB中添加元器件以及删除元器件
  • 银河麒麟KylinV10-sp3操作系统桌面环境安装
  • 重练算法(代码随想录版) day4 - 链表part2
  • 实用指南:【第十七周】机器学习笔记06
  • 耄大厨——AI厨师智能体(3-程序调用)
  • flask: 保存异常时的错误信息和堆栈到日志
  • 2020:【例4.5】第几项
  • 深入解析:【深入浅出PyTorch】--6.2.PyTorch进阶训练技巧2
  • Django `models.Field` 所有常见安装参数的完整清单与说明表
  • Java Redis “Sentinel(哨兵)与集群”面试清单(含超通俗生活案例与深度理解) - 实践
  • 应用于ElasticSearch的C++ API——elasticlient - 教程
  • China Collegiate Programming Contest (CCPC) Jinan Site (The 3rd Universal Cup. Stage 17: Jinan) 题解
  • csp-j/s历险记
  • 深信服AC1700
  • 2025年FFS重膜包装机厂家综合实力排行榜TOP5
  • 2025年国内重袋包装机品牌推荐榜单
  • 164. 最大间距
  • 软考完结篇
  • 2025大厂高频软件测试面试真题(附答案)
  • visio绘制带公式图片作为latex插图
  • Jenkins Pipeline post指令详解 - 实践
  • SGLANG Docker容器化部署指南
  • 保研经验分享
  • Vibe Coding - 零成本使用claude code 、gpt-5、grok-code-fast-1氛围编程
  • MyBatis-Plus分页查询中distinct与order by组合的SQLServer兼容性问题解析 - 教程
  • 【React】useMemo 和 useEffect 的用法 - 实践
  • [LangChain] 15. 内存型向量库