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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CF1080F Katya and Segments Sets

發布時間:2023/12/1 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF1080F Katya and Segments Sets 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:洛谷

題目描述:【看翻譯】


這種強制在線的方法可真是奇妙。

主席樹可真是奇妙。

我們用主席樹的版本維護$x\leq l$的限制,用線段樹維護$[a,b]$的限制,用節點的值來維護$r\leq y$的限制。

詳細地說,就是先將線段排序($l$為第一關鍵字,$r$為第二關鍵字),然后倒序所屬集合作為位置,右端點作為值插入主席樹。

主席樹的第$i$個版本維護的是排序后,后面$k-i+1$個線段的線段樹。

因為它要求集合里面有一個滿足就可以,所以同一個位置的右端點取最小值

因為它要求$[a,b]$的集合都要滿足,所以線段樹維護區間最大值

每次查詢的時候,找到左端點$\geq x$的最靠前的線段,設為第$i$個,則在第$i$個版本中,看$[a,b]$的最大值是否$\leq y$,如果是就是yes,否則就是no。

1 #include<bits/stdc++.h> 2 #define Rint register int 3 using namespace std; 4 const int N = 300003, INF = 0x3f3f3f3f; 5 struct Seg { 6 int l, r, p; 7 inline bool operator < (const Seg &o) const {return l < o.l || l == o.l && r < o.r;} 8 } a[N]; 9 int n, m, k, cnt, root[N], seg[N << 5], ls[N << 5], rs[N << 5]; 10 inline void pushup(int x){ 11 seg[x] = max(seg[ls[x]], seg[rs[x]]); 12 } 13 inline void build(int &x, int L, int R){ 14 seg[x = ++ cnt] = INF; 15 if(L == R) return; 16 int mid = L + R >> 1; 17 build(ls[x], L, mid); 18 build(rs[x], mid + 1, R); 19 } 20 inline void change(int &nx, int ox, int L, int R, int pos, int val){ 21 seg[nx = ++ cnt] = seg[ox]; 22 ls[nx] = ls[ox]; rs[nx] = rs[ox]; 23 if(L == R){ 24 seg[nx] = min(seg[nx], val); 25 return; 26 } 27 int mid = L + R >> 1; 28 if(pos <= mid) change(ls[nx], ls[ox], L, mid, pos, val); 29 else change(rs[nx], rs[ox], mid + 1, R, pos, val); 30 pushup(nx); 31 } 32 inline int query(int x, int L, int R, int l, int r){ 33 if(l <= L && R <= r) return seg[x]; 34 int mid = L + R >> 1, ans = 0; 35 if(l <= mid) ans = max(ans, query(ls[x], L, mid, l, r)); 36 if(mid < r) ans = max(ans, query(rs[x], mid + 1, R, l, r)); 37 return ans; 38 } 39 int main(){ 40 scanf("%d%d%d", &n, &m, &k); 41 for(Rint i = 1;i <= k;i ++) 42 scanf("%d%d%d", &a[i].l, &a[i].r, &a[i].p); 43 sort(a + 1, a + k + 1); 44 build(root[k + 1], 1, n); 45 for(Rint i = k;i;i --) 46 change(root[i], root[i + 1], 1, n, a[i].p, a[i].r); 47 a[k + 1].l = INF; 48 while(m --){ 49 int A, B, X, Y; 50 scanf("%d%d%d%d", &A, &B, &X, &Y); 51 int ans = -1, mid, left = 1, right = k + 1; 52 while(left <= right){ 53 mid = left + right >> 1; 54 if(a[mid].l >= X) ans = mid, right = mid - 1; 55 else left = mid + 1; 56 } 57 puts(query(root[ans], 1, n, A, B) <= Y ? "yes" : "no"); 58 fflush(stdout); 59 } 60 } View Code

?

轉載于:https://www.cnblogs.com/AThousandMoons/p/ntfakgdoi.html

總結

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

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