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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Interval query

發布時間:2025/3/21 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Interval query 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

給出數軸上的N個區間,M個詢問"QUERY(a, b)", 意為[a, b]之間不相交的集合的最大數量是多少。

?

解法:

考慮 $O(n)$ 的貪心做法,預處理出對于每一個位置$i$,滿足$i \leq L_j$ 的 $R_j$的最小值

這樣暴力向后找即可。

用倍增優化這個過程 $O(nlogn)$

?

#include <bits/stdc++.h> #define N 100010using namespace std;struct node {int l,r; }a[N],q[N];int n,m,tot0; int a0[N<<2]; int minR[N<<2][21];bool cmp(node a,node b) {return a.l<b.l; }int ask(int l,int r) {int x = l,ans = 0;for(int i=20;~i;i--)if(minR[x][i] <= r)x = minR[x][i], ans += (1<<i);return ans; }int main() {while(~scanf("%d%d",&n,&m)){a0[0] = 0;for(int i=1;i<=n;i++){scanf("%d%d",&a[i].l,&a[i].r);a0[++a0[0]] = a[i].l;a0[++a0[0]] = a[i].r;}for(int i=1;i<=m;i++){scanf("%d%d",&q[i].l,&q[i].r);a0[++a0[0]] = q[i].l;a0[++a0[0]] = q[i].r;}sort(a0+1,a0+a0[0]+1);tot0=1;for(int i=2;i<=a0[0];i++) if(a0[i]!=a0[i-1]) a0[++tot0] = a0[i];for(int i=1;i<=n;i++){a[i].l = lower_bound(a0+1,a0+tot0+1,a[i].l) - a0;a[i].r = lower_bound(a0+1,a0+tot0+1,a[i].r) - a0;}sort(a+1,a+n+1,cmp);int j=n,tmpR = tot0+1;for(int i=tot0;i>=1;i--){while(j>0 && a[j].l >= i){tmpR = min(tmpR, a[j].r);j--;}minR[i][0] = tmpR;}for(int t=1;t<=20;t++)for(int i=1;i<=tot0;i++){if(minR[i][t-1]<=tot0)minR[i][t] = minR[minR[i][t-1]][t-1];else minR[i][t] = tot0+1;}for(int i=1;i<=m;i++){q[i].l = lower_bound(a0+1,a0+tot0+1,q[i].l) - a0;q[i].r = lower_bound(a0+1,a0+tot0+1,q[i].r) - a0;printf("%d\n",ask(q[i].l,q[i].r));}}return 0; } View Code

?

轉載于:https://www.cnblogs.com/lawyer/p/6832411.html

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

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

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