首页 > 其他分享 >【题解】洛谷P1712: [NOI2016] 区间

【题解】洛谷P1712: [NOI2016] 区间

时间:2024-11-14 11:08:10浏览次数:1  
标签:pr int 题解 P1712 NOI2016 ls 区间

P1712 [NOI2016] 区间

我对尺取法并不敏感,所以感觉有点难度,我们想到按照区间长度排序加入使得满足单调性,直到有一个区间的覆盖次数达到了m就可以计算了,而这个就是尺取法,单调性使得我们答案总是最优的。

覆盖次数就可以用线段树做,而且数据范围很大需要离散化,计算答案时注意把答案带回到离散数组中。

我们思路进度:想到可能需要覆盖但不会如何使得区间答案最小化,之后我又以为要线段树记录最大值最小值。

最小化最大最小值使用尺取。

#include <bits/stdc++.h>
#define int long long
#define ls p<<1
#define rs p<<1|1 
#define re register 
using namespace std;
const int N=5e5+10;

int n,m;
int b[N<<1];
struct ss{
	int l,r;
}a[N];

int ans=2e9;

int t[N<<3],add[N<<3];

int getsum(int l,int r){
	return (b[a[r].r]-b[a[r].l])-(b[a[l].r]-b[a[l].l]);
}

bool cmp(ss g,ss h){
	return (g.r-g.l)<(h.r-h.l);
}

void read(){
	cin>>n>>m;
	for(re int i=1;i<=n;i++){
		cin>>a[i].l>>a[i].r;
		b[i*2-1]=a[i].l;
		b[i*2]=a[i].r;
	}
	sort(a+1,a+n+1,cmp);
	sort(b+1,b+n*2+1);
	int tot=unique(b+1,b+2*n+1)-b-1;
	for(re int i=1;i<=n;i++){
		a[i].l=lower_bound(b+1,b+1+tot,a[i].l)-b;
		a[i].r=lower_bound(b+1,b+1+tot,a[i].r)-b;
	}
}

void pushdown(int p,int pl,int pr){
	if(add[p]){
		int tag=add[p];
		add[p]=0;
		
		t[ls]+=tag;
		t[rs]+=tag;
		
		add[ls]+=tag;	
		add[rs]+=tag;
	}
}

void change(int p,int pl,int pr,int l,int r,int x){
	if(pl>r||pr<l){
		return;
	}
	if(pl>=l&&pr<=r){
		t[p]+=x;
		add[p]+=x;
		return; 
	}
	pushdown(p,pl,pr);
	int mid=(pl+pr)>>1;
	change(ls,pl,mid,l,r,x);
	change(rs,mid+1,pr,l,r,x);
	t[p]=max(t[ls],t[rs]);
}

signed main(){
//	freopen("P3709_2.in","r",stdin);
//	freopen("a.out","w",stdout);
    ios::sync_with_stdio(false);
	read();
	
	int l=0,r=0;
	t[0]=-1;
	while(1){
		while(t[1]<m&&r<=n){
			r++;
			change(1,1,2*n,a[r].l,a[r].r,1);
		}
		if(t[1]<m){
			break;
		}
		while(t[1]>=m&&l<=n){
			l++;
			change(1,1,2*n,a[l].l,a[l].r,-1);
		}
		
		ans=min(ans,getsum(l,r));
	}
	
	if(ans==2e9){
		cout<<-1;
	}
	else{
		cout<<ans;
	}
    return 0;
}

标签:pr,int,题解,P1712,NOI2016,ls,区间
From: https://www.cnblogs.com/sadlin/p/18545597

相关文章

  • 题解:P11251 [GESP202409 八级] 美丽路径
    题目传送门题目大意给你一颗树,每个结点为黑色或白色。求一条路径,使得路径上距离为奇数的点颜色不同,距离为偶数的点颜色相同,输出这条路径最多能包含多少结点。思路讲解容易想到用树形动态规划搭配dfs解决。将结点1......
  • 2021年6月上海月赛T5题解(做基础123题时遇到的)
    平衡点内存限制: 256 Mb时间限制: 1000 ms题目描述给定一个由 n 个整数组成的数列a1​,a2​,⋯,an​,请为这个数列找到一个平衡点,使得平衡点左侧与右侧的力矩尽量接近。若平衡点为 ak​,则左侧力矩定义为数列中下标小于 k 的各个元素到 ak​ 的距离乘以这些元素......
  • 「AT_diverta2019_2_e」Balanced Piles 题解
    题意描述有一个长度为\(N(2\leN\le10^6)\)的数组,一开始所有元素均为\(0\)。设\(M\)为当前数组中的最大元素,\(m\)是当前数组中的最小元素,你可以执行若干次以下操作:选择一个大小为\(m\)的元素,把他变为\(x\),其中\(M\lex\leM+D\)且\(m<x\)。求有多少种操作方法......
  • [ARC105C] Camels and Bridge 题解
    [ARC105C]CamelsandBridge题解https://www.luogu.com.cn/problem/AT_arc105_c记:这是24年夏天在北京梦熊写的(模拟赛撞原),希望这年夏天fowever。sol首先\(n\)很小,所以可以去暴力枚举顺序,也就是全排列。\(W_s\)表示排列为\(s\)时的间距。又令\(f_i\)为前\(i\)只......
  • [题解]P3119 [USACO15JAN] Grass Cownoisseur G
    P3119[USACO15JAN]GrassCownoisseurG显然我们可以先跑强连通分量,由\(x\)个点缩成的新点\(u\)权值为\(v[u]=x\)。下文中的节点\(1\)均表示缩点后节点\(1\)所在的节点。我们在缩点后的DAG上跑拓扑排序,预处理出\(fa[i]\)和\(fb[i]\),分别表示“\(1\)到\(i\)路径的点权和”,“\(i......
  • 洛谷P11228的C++题解
    题目分析题目题目让我们算出机器人走步后经过了多少个不重复的点这道题不是搜索!直接按照题意模拟就行了。遇到墙就向右转,不是就直行。特别注意:向右转也是一步!一个格子最多算一遍!我们可以用一个标记数组 st,走过的点就打上标记。判断走道的点有没有打上标记,有就不......
  • P2779 [AHOI2016初中组] 黑白序列题解
    题意:小可可准备了一个未完成的黑白序列,用B和W表示黑色和白色,用?表示尚未确定。他希望知道一共有多少种不同的方法,在决定了每一个?位置的颜色后可以得到一个小雪喜欢的黑白序列。其中,小雪喜欢的黑白序列指的是对于任何正整数\(n\),由连续\(n\)个黑接上连续\(n\)个白......
  • 题解:CF2025E Card Game
    在这貌似和大部分做法不太一样(?)权当卡特兰数的复习题吧。不会卡特兰数的可以先看文末。如果没有花色\(1\)这道题就很简单了,对于每个别的花色都有\(C(m)\)种分配方案。\(C(n)\)表示卡特兰数的第\(n\)项,答案就是乘起来。发现除了花色\(1\)每种花色的牌都是独立的。这......
  • P6628 [省选联考 2020 B 卷] 丁香之路 题解
    P6628[省选联考2020B卷]丁香之路题解首先考虑题目中路径权值的含义:\(i,j\)两点之间的最短路就是\(|i-j|\)直接连边。题目要求从\(s\)遍历到每个点,到终点每个\(x\)的最短时间。于是我们不妨枚举每个\(x\),考虑在\(O(n)\)至\(O(n\logn)\)的时间复杂度里解决问题......
  • 《统计每个月兔子的总数》 递归、记忆化数组、动态规划题解
    目录题目描述输入描述输出描述解析完整代码描述有一对兔子,从出生后第3个月起每个月都生一对兔子,一对小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第n个月(n<=50)的兔子总数为多少对?输入描述输入1个整数n,表示第几个月输出描述第n个月兔子的总数量有多少?......