Interval query
生活随笔
收集整理的這篇文章主要介紹了
Interval query
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
給出數(shù)軸上的N個(gè)區(qū)間,M個(gè)詢問"QUERY(a, b)", 意為[a, b]之間不相交的集合的最大數(shù)量是多少。
?
解法:
考慮 $O(n)$ 的貪心做法,預(yù)處理出對于每一個(gè)位置$i$,滿足$i \leq L_j$ 的 $R_j$的最小值
這樣暴力向后找即可。
用倍增優(yōu)化這個(gè)過程 $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?
轉(zhuǎn)載于:https://www.cnblogs.com/lawyer/p/6832411.html
《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Interval query的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux命令 比较文件
- 下一篇: 安装开发环境注意事项2