E. Boring Segments
1.Iva & Pav2.P2023 [AHOI2009] 维护序列3.P1531 I Hate It4.P5057 [CQOI2006] 简单题5.P2357 守墓人6.P8775 [蓝桥杯 2022 省 A] 青蛙过河7.Dora and Search8.P6492 [COCI2010-2011#6] STEP9.D. Slimes10.P1040 [NOIP2003 提高组] 加分二叉树11.P2466 [SDOI2008] Sue 的小球12.P3957 [NOIP2017 普及组] 跳房子13.P2135 方块消除14.P1884 [USACO12FEB] Overplanting S15.P2642 双子序列最大和16.P2422 良好的感觉17.P3128 [USACO15DEC] Max Flow P18.P3258 [JLOI2014] 松鼠的新家19.P3384 【模板】重链剖分/树链剖分20.P5367 【模板】康托展开21.P2344 [USACO11FEB] Generic Cow Protests G22.P2709 小B的询问23.P4145 上帝造题的七分钟 2 / 花神游历各国24.P5677 [GZOI2017] 配对统计25.P2161 [SHOI2009] 会场预约26.F. Equal XOR Segments27.D. A BIT of an Inequality28.P3147 [USACO16OPEN] 262144 P29.P4290 [HAOI2008] 玩具取名30.E. Long Inversions31.P1668 [USACO04DEC] Cleaning Shifts S32.P9691 [GDCPC2023] Base Station Construction33.P2734 [USACO3.3] 游戏 A Game34.D. Sum of XOR Functions35.C. Medium Design36.F. Feed Cats
37.E. Boring Segments
题解
只要求最大值和最小值的差尽量小,也就意味着,权值位于最大值和最小值之间的线段可以任意取
也就是说,我们将线段按权值排序,我们只需要取其中一段区间,然后查看是否覆盖了完整的区间,如果是,判断能否更新最小值
这样看起来是两次for循环找区间,对于查看是否完整覆盖区间的部分,看起来是对区间内每个点+1,然后查看全域最小值
这样看起来是
优化:
对于区间修改,区间查找,我们可以用线段树维护,时间复杂度来到
再度优化:我们可以遍历
双指针上楼:我们发现,在遍历
code
#include<bits/stdc++.h>
#define ll long long
#define lowbit(x) ((x)&(-x))
using namespace std;
const ll inf=1e18;
ll tree[4000006]={0};
struct node
{
ll l,r,v;
}seg[300005];
bool cmp(node a,node b)
{
return a.v<b.v;
}
ll lazytag[4000006]={0};
void pushdown(ll node,ll l,ll r)
{
tree[node]+=lazytag[node];
if(l!=r)
{
lazytag[node*2]+=lazytag[node];
lazytag[node*2+1]+=lazytag[node];
}
lazytag[node]=0;
}
void update(ll node,ll l,ll r,ll x,ll y,ll val)
{
if(lazytag[node]) pushdown(node,l,r);
if(l>y||r<x) return ;
if(l>=x&&r<=y)
{
lazytag[node]=val;
pushdown(node,l,r);
return;
}
ll mid=(l+r)/2;
update(node*2,l,mid,x,y,val);update(node*2+1,mid+1,r,x,y,val);
tree[node]=min(tree[node*2],tree[node*2+1]);
}
void solve()
{
ll n,m;
cin>>n>>m;
for(ll i=1;i<=n;i++)
{
cin>>seg[i].l>>seg[i].r>>seg[i].v;
}
sort(seg+1,seg+1+n,cmp);
ll itl=1;
ll ans=inf;
for(ll itr=1;itr<=n;itr++)
{
update(1,1,m-1,seg[itr].l,seg[itr].r-1,1);
while(itl<=itr&&tree[1]>0)
{
update(1,1,m-1,seg[itl].l,seg[itl].r-1,-1);
itl++;
}
// printf("itl:%d itr:%d\n",itl,itr);
if(itl!=1) ans=min(ans,seg[itr].v-seg[itl-1].v);
}
cout<<ans;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
ll TT=1;
//cin>>TT;
while(TT--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!