日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P1712 [NOI2016]区间

發布時間:2023/12/3 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1712 [NOI2016]区间 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

P1712 [NOI2016]區間

題目描述

P1712?[NOI2016]區間

Solution

尺取法+線段樹

一個顯然的想法是按區間長度排序。

每一次多選取一個區間相當于區間覆蓋次數加1,每一次少選取一個區間就有區間覆蓋次數減1。

可以用線段樹維護區間覆蓋次數的最大值。

于是轉化成了一個Two-Pointers的問題,尺取法掃一遍即可。

時間復雜度? ?。

Code

#include<bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; const int MAXN=1e6+50;inline int read() {int x=0,f=1; char c=getchar();while (c<'0'||c>'9') { if(c=='-') f=-1; c=getchar(); }while (c>='0'&&c<='9') { x=(x<<3)+(x<<1)+(c^48); c=getchar(); }return x*f; } struct qnode{int opt,id,x,color; } q[MAXN]; int compareq(qnode x,qnode y) { return (x.x<y.x)||(x.x==y.x&&x.opt<y.opt); } struct anode{int lpre,rpre,lnow,rnow,len; } a[MAXN]; int comparea(anode x,anode y){ return x.len<y.len; } struct Segment_Tree {struct segnode{int l,r,tag,mx; } tree[MAXN<<2];void up(int x){ tree[x].mx=max(tree[x<<1].mx,tree[x<<1|1].mx); }void down(int x){if (tree[x].tag!=0){int q=tree[x].tag;tree[x<<1].tag+=q,tree[x<<1].mx+=q;tree[x<<1|1].tag+=q,tree[x<<1|1].mx+=q;tree[x].tag=0;}}void build(int x,int l,int r){if ((tree[x].l=l)==(tree[x].r=r)) return;int mid=(l+r)>>1;build(x<<1,l,mid);build(x<<1|1,mid+1,r);}int query(int x,int l,int r){if (tree[x].l>=l&&tree[x].r<=r) return tree[x].mx;down(x);int mid=(tree[x].l+tree[x].r)>>1;if (r<=mid) return query(x<<1,l,r);else if (l>mid) return query(x<<1|1,l,r);else return max(query(x<<1,l,mid),query(x<<1|1,mid+1,r));}void change(int x,int l,int r,int y){if (tree[x].l>=l&&tree[x].r<=r){tree[x].mx+=y;tree[x].tag+=y;return;}down(x);int mid=(tree[x].l+tree[x].r)>>1;if (r<=mid) change(x<<1,l,r,y);else if (l>mid) change(x<<1|1,l,r,y);else change(x<<1,l,mid,y),change(x<<1|1,mid+1,r,y);up(x);} } segment; int main() {int n=read(),m=read(),num=0;for (int i=1;i<=n;i++){int l=read(),r=read();q[++num]=(qnode){0,i,l,0};q[++num]=(qnode){1,i,r,0};}sort(q+1,q+num+1,compareq);q[0].x=-1;for (int i=1;i<=num;i++) {q[i].color=q[i-1].color+(q[i].x!=q[i-1].x);if (q[i].opt==0) a[q[i].id].lpre=q[i].x,a[q[i].id].lnow=q[i].color;if (q[i].opt==1) a[q[i].id].rpre=q[i].x,a[q[i].id].rnow=q[i].color,a[q[i].id].len=a[q[i].id].rpre-a[q[i].id].lpre+1;}sort(a+1,a+n+1,comparea);cout<<endl;for (int i=1;i<=n;i++) cout<<a[i].lpre<<" "<<a[i].rpre<<" "<<a[i].lnow<<" "<<a[i].rnow<<" "<<a[i].len<<endl;segment.build(1,1,q[num].color);int ans=INF;for (int l=1,r=1;r<=n;r++){segment.change(1,a[r].lnow,a[r].rnow,1);while (segment.query(1,1,q[num].color)>=m) {ans=min(ans,a[r].len-a[l].len);segment.change(1,a[l].lnow,a[l].rnow,-1);l++;}}if (ans==INF) puts("-1"); else printf("%d\n",ans);return 0; }

?

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的P1712 [NOI2016]区间的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。