E. Boring Segments(尺取&线段树)

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了E. Boring Segments(尺取&线段树)相关的知识,希望对你有一定的参考价值。

E. Boring Segments(尺取&线段树)

尺取+线段树

将线段按 v a l u e value value排序,显然左指针右移,右指针不会左移。

然后维护区间是否被覆盖(就是维个min)即可。

// Problem: E. Boring Segments
// Contest: Codeforces - Educational Codeforces Round 112 (Rated for Div. 2)
// URL: https://codeforces.ml/contest/1555/problem/E
// Memory Limit: 256 MB
// Time Limit: 3000 ms
// Date: 2021-07-30 22:36:40
// --------by Herio--------

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull; 
const int N=3e5+5,M=1e6+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0) 
void Print(int *a,int n){
	for(int i=1;i<n;i++)
		printf("%d ",a[i]);
	printf("%d\\n",a[n]); 
}
//区间修改 区间求和
#define lx x<<1
#define rx x<<1|1
#define len(x) (a[x].r-a[x].l+1)
struct node{
	int l,r,lz;
	int mn;
}a[M<<2];
inline void re(int x){
	a[x].mn=min(a[lx].mn,a[rx].mn);
}
inline void pd(int x,int y){
	a[x].mn+=y,a[x].lz+=y;
}
inline void pushdown(int x){
	if(a[x].lz){
		pd(lx,a[x].lz),pd(rx,a[x].lz);
		a[x].lz=0;
	}
}
void bud(int x,int l,int r){
	a[x].l=l,a[x].r=r;
	if(l==r){
		return;
	}
	int mid=(l+r)>>1;
	bud(lx,l,mid);
	bud(rx,mid+1,r);
	re(x);
}
void upd(int x,int l,int r,int val){
	if(a[x].l>=l&&a[x].r<=r){
		pd(x,val);return;
	}
	pushdown(x);
	int mid=(a[x].l+a[x].r)>>1;
	if(l<=mid) upd(lx,l,r,val);
	if(r>mid) upd(rx,l,r,val);
	re(x);
}
int n,m;
struct query{
	int l,r,v;
	bool operator <(const query &a)const{
		return v<a.v;
	}
}q[N];
int main(){
	scanf("%d%d",&n,&m);
	bud(1,1,m-1);
	for(int i=1;i<=n;i++) scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].v);
	sort(q+1,q+n+1);int ans=2e9;
	for(int L=1,R=1;R<=n;R++){
		upd(1,q[R].l,q[R].r-1,1);
		while(a[1].mn){
			ans=min(ans,q[R].v-q[L].v);
			upd(1,q[L].l,q[L].r-1,-1);
			L++;
		}
	}
	printf("%d\\n",ans);
	return 0;
}

才发现是跟 NOI 2016 一道很类似的题。

传送门

以上是关于E. Boring Segments(尺取&线段树)的主要内容,如果未能解决你的问题,请参考以下文章

cf1555 E. Boring Segments

Boring Segments-CF教育场112.尺取+线段树

Educational Codeforces112 1555.E. Boring Segments(尺取+线段树)

E. Pencils and Boxes(尺取&dp)

E. Segments Removal(优先队列&set)

E. Special Segments of Permutation(双指针&分治)