题目描述

有n朵花,每朵花有三个属性:花形(s)、颜色(c)、气味(m),用三个整数表示。现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb。显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。

分析

人生的第一道cdq分治,一开始还是非常头痛的,然后看了大佬们的博客之后差不多知道cdq超短裙分治是什么了。
就针对于这道题目,第一位很显然是排序,然后第二维是cdq分治求逆序对,第三维是用树状数组求逆序对。
简单讲一下cdq分支的思想:分治区间\([l,r]\),递归解决子问题\([l,mid]\)和\([mid+1,r]\),那么我们统计左区间对右区间答案的贡献,因为每一次都是分治,所以不会有答案重叠。因为右区间的第二维是有序的,于是可以扫一遍右区间,每次找到左区间最大的第二维小于当前枚举到的右区间元素的第二维的元素,用树状数组维护第三维,更新答案。

ac代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
using namespace std;
template <typename T>
inline void read(T &x) {
    x = 0; T fl = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        if (ch == '-') fl = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    x *= fl;
}
#define N 100005
struct data {
    int x, y, z, res, cnt;
    data() {
        x = y = z = res = cnt = 0;
    }
}a[N], v[N];
int n, k;
int ans[N];
struct BIT{
    #define lowbit(x) (x&-x)
    int n, tr[N << 1];
    void add(int x, int val) {
        for (; x <= n; x += lowbit(x)) tr[x] += val;
    }
    int query(int x) {
        int res = 0;
        for (; x; x -= lowbit(x)) res += tr[x];
        return res;
    }
}tr;
bool cmp1(const data &a, const data &b) {
    if (a.x == b.x)
        if (a.y == b.y) return a.z < b.z;
        else return a.y < b.y;
    else return a.x < b.x;
}
bool cmp2(const data &a, const data &b) {
    if (a.y == b.y) return a.z < b.z;
    else return a.y < b.y;
}
void cdq(int l, int r) {
    if (l == r) return;
    int mid = (l + r) >> 1;
    cdq(l, mid);
    cdq(mid + 1, r);
    sort(v + l, v + mid + 1, cmp2);
    sort(v + mid + 1, v + r + 1, cmp2);
    int l1 = l, l2 = mid + 1;
    while (l2 <= r) {
        while (l1 <= mid && v[l1].y <= v[l2].y)
            tr.add(v[l1].z, v[l1].cnt), l1 ++;
        v[l2].res += tr.query(v[l2].z);
        l2 ++;
    }
    for (int i = l; i < l1; i ++) tr.add(v[i].z, -v[i].cnt);
}
int main() {
    read(n); read(k);
    tr.n = k;
    for (int i = 1; i <= n; i ++) {
        read(a[i].x); read(a[i].y); read(a[i].z);
    }
    sort(a + 1, a + 1 + n, cmp1);
    int tot = 0;
    for (int i = 1, j = 1; i <= n; i = j) {
        v[++ tot] = a[i];
        while (a[i].x == a[j].x && a[i].y == a[j].y && a[i].z == a[j].z && j <= n)
            j ++, v[tot].cnt ++;
    }
    cdq(1, tot);
    for (int i = 1; i <= tot; i ++)
        ans[v[i].res + v[i].cnt] += v[i].cnt;
    for (int i = 1; i <= n; i ++) printf("%d\n", ans[i]);
    return 0;
}

[luogu3810][bzoj3262]陌下花开【cdq分治】的更多相关文章

  1. BZOJ3262: 陌上花开(三维偏序,CDQ分治)

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量. 定义一朵花A比另一朵花B要美 ...

  2. 【教程】简易CDQ分治教程&学习笔记

    前言 辣鸡蒟蒻__stdcall终于会CDQ分治啦!       CDQ分治是我们处理各类问题的重要武器.它的优势在于可以顶替复杂的高级数据结构,而且常数比较小:缺点在于必须离线操作. CDQ分治的基 ...

  3. 【BZOJ3262】陌上花开 cdq分治

    [BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...

  4. BZOJ3262陌上花开(三维偏序问题(CDQ分治+树状数组))+CDQ分治基本思想

    emmmm我能怎么说呢 CDQ分治显然我没法写一篇完整的优秀的博客,因为我自己还不是很明白... 因为这玩意的思想实在是太短了: fateice如是说道: 如果说对于一道题目的离线操作,假设有n个操作 ...

  5. bzoj3262陌上花开 cdq分治入门题

    Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...

  6. HDU - 6183 暴力,线段树动态开点,cdq分治

    B - Color itHDU - 6183 题目大意:有三种操作,0是清空所有点,1是给点(x,y)涂上颜色c,2是查询满足1<=a<=x,y1<=b<=y2的(a,b)点一 ...

  7. 【学术篇】bzoj3262 陌上花开. cdq分治入门

    花儿们已经很累了-- 无论是花形.颜色.还是气味, 都不是为了给人们摆出来欣赏的, 更不是为了当做出题的素材的, 她们并不想自己这些属性被没有生命的数字量化, 并不想和其它的花攀比, 并无意分出个三六 ...

  8. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1439  Solved: 648[Submit][Status][Discuss ...

  9. 【BZOJ3262】陌上花开 (CDQ分治+树状数组+排序)

    Time Limit: 3000 ms   Memory Limit: 256 MB Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现要对每 ...

随机推荐

  1. Shell脚本2

      5 Shell传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数, 脚本内获取参数的格式为:$n.n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… ...

  2. ReentrantLock源码分析

    参考: 五月的仓颉 ReentrantLock实现原理 活在梦里 AQS源码解读 重入锁是基于AQS实现的,它提供了公平锁和非公平锁两个版本的实现. public class ReentrantLoc ...

  3. 【kindle笔记】之 《解忧杂货店》-2018-3-13

    [kindle笔记]读书记录-总 <解忧杂货店>-2018-3-13 东野的大ID加上此书的大ID,今天终于在回来天津的火车上一口气读完了. 此前在微信读书上看过这本书,只看了前一部分,感 ...

  4. Oracle 用户管理与权限分配

    用户管理是系统管理员最基本的任务之一,用户想要连接数据库并且使用相应的系统资源就必须是系统的合法用户且具有对应的权限. 1 创建用户 default tablespace default_tables ...

  5. mysql中的几种日志了解

    前言 MySQL中有以下日志文件,分别是: 1:重做日志(redo log) 2:回滚日志(undo log) 3:二进制日志(binlog) 4:错误日志(errorlog) 5:慢查询日志(slo ...

  6. unsupported time zone specified undefined

    unsupported time zone specified undefined   出现了这个问题,莫名其妙的,上次被我下回去了,真的是下回去的,我一去查看,坐在电脑前面问题就不见了…… 具体出现 ...

  7. 用 Python 写一个多进程兼容的 TimedRotatingFileHandler

    我前面有篇文章已经详细介绍了一下 Python 的日志模块.Python 提供了非常多的可以运用在各种不同场景的 Log Handler. TimedRotatingFileHandler 是 Pyt ...

  8. idea使用破解版mybatis plugin插件失败,idea打不开的解决方案

    记一次错误解决方案 打开 idea.vmoptions (Help -> Edit Custom VM Options...) ,在这里进行了修改 加了破解jar包的路径,但是之前的路径中有中文 ...

  9. Java多线程之通过标识关闭线程

    package org.study2.javabase.ThreadsDemo.status; /** * @Auther:GongXingRui * @Date:2018/9/19 * @Descr ...

  10. 五、core开发

    一.支付方面的 https://www.cnblogs.com/stulzq/p/7606164.htmlhttps://www.cnblogs.com/guolianyu/