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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

BZOJ2683 简单题(CDQ分治)

發(fā)布時(shí)間:2023/12/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ2683 简单题(CDQ分治) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

傳送門
之前聽(tīng)別人說(shuō)CDQ分治不難學(xué),今天才知道果真如此。之前一直為自己想不到CDQ的方法二很不爽,今天終于是想出來(lái)了一道了,太弱……
cdq分治主要就是把整段區(qū)間分成兩半,然后用左區(qū)間的值去更新右區(qū)間的答案,每次把區(qū)間折半。對(duì)于本題來(lái)說(shuō)時(shí)間復(fù)雜度T(N)=T(N/2)+O(NlogN)
T(N)=O(Nlog2N)

/**************************************************************Problem: 2683Language: C++Result: AcceptedTime:6204 msMemory:35184 kb ****************************************************************/#include <cstdio> #include <algorithm> using namespace std; #define MAXN 200005 struct Node {int t, x, y, v, k;inline bool operator < (const Node&r) const {if(x == r.x && y == r.y) return t < r.t;else if(x == r.x) return y < r.y;else return x < r.x;} } q[MAXN << 2], nq[MAXN << 2]; int n, cnt, ans; inline void GET(int &n) {n = 0; char c;do c = getchar(); while('0' > c || c > '9');do n = n * 10 + c - '0', c = getchar(); while('0' <= c && c <= '9'); } namespace BIT {int t[MAXN << 2];inline void Add(int x, int v) {for(; x <= n; x += x&-x) t[x] += v;}inline int Query(int x, int s = 0) {for(; x; x -= x&-x) s+=t[x];return s;} } void cdq(int l, int r) {if(l >= r) return;using namespace BIT;int mid = (l + r) >> 1, lp = l, rp = mid+1;for(int i = l; i <= r; ++ i)if(q[i].t <= mid && q[i].k == 1) Add(q[i].y, q[i].v);else if(q[i].t > mid && q[i].k == 2) q[i].v += Query(q[i].y);for(int i = l; i <= r; ++ i) {if(q[i].t <= mid && q[i].k == 1) Add(q[i].y, -q[i].v);if(q[i].t <= mid) nq[lp ++] = q[i];else nq[rp ++] = q[i];}for(int i = l; i <= r; ++ i) q[i] = nq[i];cdq(l, mid); cdq(mid+1, r); } int main() {scanf("%d", &n);int op, x, y, a, b;while(~scanf("%d", &op) && 3 != op) {if(1 == op) {GET(x); GET(y); GET(a);q[++ cnt] = { cnt, x, y, a, 1 };}else {GET(x); GET(y); GET(a); GET(b);q[++ cnt] = { cnt, x-1, y-1, 0, 2 };q[++ cnt] = { cnt, x-1, b, 0, 2 };q[++ cnt] = { cnt, a, y-1, 0, 2 };q[++ cnt] = { cnt, a, b, 0, 2 };}}sort(q+1, q+cnt+1);cdq(1, cnt);for(int i = 1; i <= cnt; ++ i)if(q[i].k == 2) {ans = q[i].v - q[i+1].v - q[i+2].v + q[i+3].v;printf("%d\n", ans); i += 3;}return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/geng4512/p/5296858.html

總結(jié)

以上是生活随笔為你收集整理的BZOJ2683 简单题(CDQ分治)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。