[NOI2016]区间-线段树
生活随笔
收集整理的這篇文章主要介紹了
[NOI2016]区间-线段树
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
一道很巧妙的題。
首先我們需要解決的問(wèn)題,怎么快速判斷選出的m個(gè)區(qū)間是否存在交。
我們反過(guò)來(lái)考慮這個(gè)問(wèn)題,
我們每一個(gè)選出的區(qū)間,就對(duì)應(yīng)的在線段樹上區(qū)間加1,那么只要存在最大值等于m,就一定有m個(gè)區(qū)間滿足條件了。
那么把區(qū)間從小到大排序,一直加到最大值等于m,更新答案,然后刪掉最小區(qū)間,不停的做下去就好了。
#include <bits/stdc++.h> #define lson p<<1 #define rson (p<<1)|1 using namespace std; inline int gi () {int x=0, w=0; char ch=0;while (! (ch>='0' && ch<='9') ) {if (ch=='-') w=1;ch=getchar ();}while (ch>='0' && ch<='9') {x= (x<<3) + (x<<1) + (ch^48);ch=getchar ();}return w?-x:x; }const int N=5e5+10; int n,m,head=1,Ans=0x3f3f3f3f,Num,Ls[N<<1],LS[N<<1],Cnt[N<<3],Tag[N<<3];struct Sect {int l, r, val; }s[N]; bool Cmp (Sect a, Sect b) {return a.val<b.val; }void Pushup (int p) {Cnt[p]=max (Cnt[lson], Cnt[rson]); }void Pushdown (int p) {if (!Tag[p]) return;Tag[lson]+=Tag[p];Tag[rson]+=Tag[p];Cnt[lson]+=Tag[p];Cnt[rson]+=Tag[p];Tag[p]=0; }void Modify (int p, int l, int r, int Ml, int Mr, int val) {if (l>=Ml && Mr>=r) {Cnt[p]+=val;Tag[p]+=val;return;}Pushdown (p);int Mid= (l+r) >> 1;if (Ml<=Mid) Modify (lson, l, Mid, Ml, Mr, val);if (Mr>Mid) Modify (rson, Mid+1, r, Ml, Mr, val);Pushup (p); }int main () {n=gi (), m=gi ();memset (Ls, -1, sizeof (Ls) );memset (LS, -1, sizeof (LS) );for (int i=1;i<=n;++i) {s[i].l=gi (), s[i].r=gi ();s[i].val=s[i].r-s[i].l;Ls[++Num]=s[i].l, Ls[++Num]=s[i].r;}sort (Ls+1, Ls+Num+1);for (int i=1, j=0;i<=Num;++i) {if (Ls[i]!=Ls[i-1]) LS[++j]=Ls[i];if (i==Num) {Num=j;break;}}for (int i=1;i<=n;++i) {s[i].l=lower_bound (LS+1, LS+Num+1, s[i].l) -LS;s[i].r=lower_bound (LS+1, LS+Num+1, s[i].r) -LS;} sort (s+1, s+n+1, Cmp);for (int i=1;i<=n;++i) {Modify (1, 1, Num, s[i].l, s[i].r, 1); while (Cnt[1]==m) {Ans=min (Ans, s[i].val-s[head].val);Modify (1, 1, Num, s[head].l, s[head].r, -1);head++;}}printf ("%d\n", Ans==0x3f3f3f3f?-1:Ans);return 0; } BY BHLLX?
轉(zhuǎn)載于:https://www.cnblogs.com/Bhllx/p/9930296.html
總結(jié)
以上是生活随笔為你收集整理的[NOI2016]区间-线段树的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: .py与.pyc文件区别
- 下一篇: ArrayListLinkedList