题目链接

题目就是赤裸裸的三维偏序,所以用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分治树状数组||树套树)相关推荐

  1. 树状数组及线段树入门(SDNU1665-1668)

    目录 前言 树状数组 先导 单点修改区间查询 区间修改区间查询 线段树 先导 单点修改区间查询--递归形式 单点修改区间查询--非递归形式 区间修改区间查询--递归形式 区间修改区间查询--非递归形式 ...

  2. #175-【线段树与树状数组】砍树

    Description 在一个凉爽的夏夜,xth 和 rabbit 来到花园里砍树.为啥米要砍树呢?是这样滴, 小菜儿的儿子窄森要出生了.Xth这个做伯伯的自然要做点什么.于是他决定带着 rabbit ...

  3. LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.

    分块1 分块2 分块4 模板一共有九个.我试着在三天内做了3个. 应该不用超链接吧. 分块1 区间加,单点询问. 这不是裸的改版树状数组吗?用树状数组处理前缀和水过. #include<bits ...

  4. AcWing 蓝桥杯AB组辅导课 05、树状数组与线段树

    文章目录 前言 一.树状数组 1.1.树状数组知识点 1.2.树状数组代码模板 模板题:AcWing 1264. 动态求连续区间和 例题 例题1.AcWing 1265. 数星星[中等,信息学奥赛一本 ...

  5. BZOJ3262: 陌上花开(cdq分治)

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 3627  Solved: 1705 [Submit][Status][Discuss] Descri ...

  6. szu 寒训第二天 树状数组 二维树状数组详解,以及树状数组扩展应用【求逆序对,以及动态第k小数】

    树状数组(Binary Index Tree) 树状数组可以解决可以转化为前缀和问题的问题 这是一类用以解决动态前缀和的问题 (有点像线段树简版) 1.对于 a1 + a2 + a3 + - + an ...

  7. LeetCode Range Sum Query - Mutable(树状数组、线段树)

    问题:给出一个整数数组,求出数组从索引i到j范围内元素的总和.update(i,val)将下标i的数值更新为val 思路:第一种方式是直接根据定义,计算总和时直接计算从i到j的和 第二种方式是使用树状 ...

  8. 第五讲 树状数组与线段树 【未完结】

    目录 1264. 动态求连续区间和 [树状数组板子题] 1265. 数星星 [树状数组变种] 1270. 数列区间最大值 [线段树 / 区间内求最大值] 1215. 小朋友排队 [树状数组] AcWi ...

  9. POJ-3067 Japan(树状数组、线段树)

    题目链接 Description Japan plans to welcome the ACM ICPC World Finals and a lot of roads must be built f ...

  10. 【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, ...

最新文章

  1. mysql 按顺序添加_MySQL按顺序排序
  2. SQL Assistant v2.5.12 序列号
  3. Delphi 防止程序多次运行《转》
  4. 对FreeMarker技术的思考
  5. Eclipse Class Decompiler——Java反编译插件
  6. 操作系统面试常问问题
  7. CMake的安装(超级详细)
  8. swpu计算机科学学院推荐免试,西南石油大学2020届本科毕业生推荐免试硕士研究生结果公示 - 千里马招标网...
  9. Android 开源控件
  10. 一文让你看懂什么是嵌入式和单片机。
  11. 端口已被占用1080(解决方案)
  12. springboot毕设项目热贡文化艺术展示与定制s5g19(java+VUE+Mybatis+Maven+Mysql)
  13. 词云python_诗词名句网 -古诗词大全|诗歌|诗词鉴赏|古诗名句|诗句赏析!
  14. 姜小白的python日记day2 变量和循环
  15. 《当下的启蒙》的概述和精华
  16. 微商截图管家 v1.0.0
  17. 非常有意思的网页版在线PS
  18. 简单js模仿浏览器crtl+f功能
  19. 清华教授:多年以来,我对我的学生都不太满意
  20. 统计笔记4:ANOVA

热门文章

  1. scrot usage
  2. xna中的截屏操作处理
  3. sonar-runner命令模式运行sonar
  4. mysql sql中的一些问题,Null与空字符
  5. 小小恋歌(小さな恋のうた)
  6. Bing搜索背景图抓取
  7. 了解 JavaScript 应用程序中的内存泄漏
  8. 【Cocos2d游戏开发之八】开启高清(960*640)模式问题与解答、图片适配以及设置iphone横竖屏...
  9. 简化CommunityServer模板机制
  10. JAVA语言基础-面向对象(方法重写概述及其应用)