[Bzoj3262]陌上花开(CDQ分治树状数组||树套树)
题目链接
题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ
CDQ+树状数组
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const ll maxn = 200000 + 100; struct node {int a, b, c, num, val; }q[maxn], w[maxn]; bool cmp(node x, node y) {return x.a == y.a ? (x.b == y.b ? x.c < y.c : x.b < y.b) : x.a < y.a; } int sum[maxn], ans[maxn]; int n, k; int lowbit(int x) {return x & -x; } void add(int x, int val) {while (x <= k) {sum[x] += val;x += lowbit(x);} } int query(int x) {int ans = 0;while (x > 0) {ans += sum[x];x -= lowbit(x);}return ans; } void CDQ(int l, int r) {if (l == r)return;int mid = l + r >> 1;CDQ(l, mid); CDQ(mid + 1, r);int L = l, R = mid + 1, cnt = l;while (L <= mid && R <= r) {if (w[L].b <= w[R].b)add(w[L].c, w[L].num), q[cnt++] = w[L++];else w[R].val += query(w[R].c), q[cnt++] = w[R++];}while (L <= mid)add(w[L].c, w[L].num), q[cnt++] = w[L++];while (R <= r)w[R].val += query(w[R].c), q[cnt++] = w[R++];for (int i = l; i <= mid; i++)add(w[i].c, -w[i].num);for (int i = l; i <= r; i++)w[i] = q[i]; } int main() {scanf("%d%d", &n, &k);for (int i = 1; i <= n; i++)scanf("%d%d%d", &q[i].a, &q[i].b, &q[i].c), q[i].num = 1;sort(q + 1, q + 1 + n, cmp);int cnt = 1;w[1] = q[1];for (int i = 2; i <= n; i++) {if (q[i].a == w[cnt].a&&q[i].b == w[cnt].b&&q[i].c == w[cnt].c)w[cnt].num++;else w[++cnt] = q[i];}CDQ(1, cnt);for (int i = 1; i <= cnt; i++)ans[w[i].val + w[i].num - 1] += w[i].num;for (int i = 0; i < n; i++)printf("%d\n", ans[i]); }
树套树(树状数组套线段树)
因为空间有限,线段树要动态开点且要写成链表QAQ。
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef unsigned long long ull; 5 const ll maxn = 200000 + 100; 6 struct node { 7 int a, b, c, num, val; 8 }q[maxn], w[maxn]; 9 bool cmp(node x, node y) { 10 return x.a == y.a ? (x.b == y.b ? x.c < y.c : x.b < y.b) : x.a < y.a; 11 } 12 int n, k; 13 int ans[maxn]; 14 struct seg { 15 struct node { 16 int val; 17 node *ls, *rs; 18 node() { val = 0; ls = rs = NULL; } 19 }; 20 node *root; 21 seg() { 22 root = NULL; 23 } 24 void update(node *&x, int pos, int val, int l, int r) { 25 if (!x)x = new node(); 26 if (l == r) { 27 x->val += val; 28 return; 29 } 30 int mid = l + r >> 1; 31 if (pos <= mid)update(x->ls, pos, val, l, mid); 32 else update(x->rs, pos, val, mid + 1, r); 33 x->val = (x->ls ? x->ls->val : 0) + (x->rs ? x->rs->val : 0); 34 } 35 int query(node *x, int L, int R, int l, int r) { 36 if (!x)return 0; 37 if (L <= l && r <= R) 38 return x->val; 39 int mid = l + r >> 1, ans = 0; 40 if (L <= mid)ans += query(x->ls, L, R, l, mid); 41 if (R > mid)ans += query(x->rs, L, R, mid + 1, r); 42 return ans; 43 } 44 }T[maxn]; 45 int lowbit(int x) { 46 return x & -x; 47 } 48 void add(int x, int q, int val) { 49 while (x <= k) { 50 T[x].update(T[x].root, q, val, 1, k); 51 x += lowbit(x); 52 } 53 } 54 int query(int x, int q) { 55 int ans = 0; 56 while (x > 0) { 57 ans += T[x].query(T[x].root, 1, q, 1, k); 58 x -= lowbit(x); 59 } 60 return ans; 61 } 62 int main() { 63 scanf("%d%d", &n, &k); 64 for (int i = 1; i <= n; i++) 65 scanf("%d%d%d", &q[i].a, &q[i].b, &q[i].c), q[i].num = 1; 66 sort(q + 1, q + 1 + n, cmp); 67 int cnt = 1; 68 w[1] = q[1]; 69 for (int i = 2; i <= n; i++) { 70 if (q[i].a == w[cnt].a&&q[i].b == w[cnt].b&&q[i].c == w[cnt].c)w[cnt].num++; 71 else w[++cnt] = q[i]; 72 } 73 for (int i = 1; i <= cnt; i++) { 74 add(w[i].b, w[i].c, w[i].num); 75 int p = query(w[i].b, w[i].c); 76 ans[p] += w[i].num; 77 } 78 for (int i = 1; i <= n; i++) 79 printf("%d\n", ans[i]); 80 }
转载于:https://www.cnblogs.com/sainsist/p/11436860.html
[Bzoj3262]陌上花开(CDQ分治树状数组||树套树)相关推荐
- 树状数组及线段树入门(SDNU1665-1668)
目录 前言 树状数组 先导 单点修改区间查询 区间修改区间查询 线段树 先导 单点修改区间查询--递归形式 单点修改区间查询--非递归形式 区间修改区间查询--递归形式 区间修改区间查询--非递归形式 ...
- #175-【线段树与树状数组】砍树
Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴, 小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着 rabbit ...
- LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.
分块1 分块2 分块4 模板一共有九个.我试着在三天内做了3个. 应该不用超链接吧. 分块1 区间加,单点询问. 这不是裸的改版树状数组吗?用树状数组处理前缀和水过. #include<bits ...
- AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树
文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...
- BZOJ3262: 陌上花开(cdq分治)
Time Limit: 20 Sec Memory Limit: 256 MB Submit: 3627 Solved: 1705 [Submit][Status][Discuss] Descri ...
- szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】
树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...
- LeetCode Range Sum Query - Mutable(树状数组、线段树)
问题:给出一个整数数组,求出数组从索引i到j范围内元素的总和.update(i,val)将下标i的数值更新为val 思路:第一种方式是直接根据定义,计算总和时直接计算从i到j的和 第二种方式是使用树状 ...
- 第五讲 树状数组与线段树 【未完结】
目录 1264. 动态求连续区间和 [树状数组板子题] 1265. 数星星 [树状数组变种] 1270. 数列区间最大值 [线段树 / 区间内求最大值] 1215. 小朋友排队 [树状数组] AcWi ...
- POJ-3067 Japan(树状数组、线段树)
题目链接 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built f ...
- 【SPOJ - DQUERY】D-query(权值树状数组 或 主席树 或 莫队)
题干: Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query is a pair (i, ...
最新文章
- mysql 按顺序添加_MySQL按顺序排序
- SQL Assistant v2.5.12 序列号
- Delphi 防止程序多次运行《转》
- 对FreeMarker技术的思考
- Eclipse Class Decompiler——Java反编译插件
- 操作系统面试常问问题
- CMake的安装(超级详细)
- swpu计算机科学学院推荐免试,西南石油大学2020届本科毕业生推荐免试硕士研究生结果公示 - 千里马招标网...
- Android 开源控件
- 一文让你看懂什么是嵌入式和单片机。
- 端口已被占用1080(解决方案)
- springboot毕设项目热贡文化艺术展示与定制s5g19(java+VUE+Mybatis+Maven+Mysql)
- 词云python_诗词名句网 -古诗词大全|诗歌|诗词鉴赏|古诗名句|诗句赏析!
- 姜小白的python日记day2 变量和循环
- 《当下的启蒙》的概述和精华
- 微商截图管家 v1.0.0
- 非常有意思的网页版在线PS
- 简单js模仿浏览器crtl+f功能
- 清华教授:多年以来,我对我的学生都不太满意
- 统计笔记4:ANOVA