题目:

Description

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

Input

第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值。
以下N行,每行三个整数si, ci, mi (1 <= si, ci, mi <= K),表示第i朵花的属性

Output

包含N行,分别表示评级为0...N-1的每级花的数量。

Sample Input

10 3
3 3 3
2 3 3
2 3 1
3 1 1
3 1 2
1 3 1
1 1 2
1 2 2
1 3 2
1 2 1

Sample Output

3
1
3
0
1
0
1
0
0
1

HINT

1 <= N <= 100,000, 1 <= K <= 200,000

Source

题解:

CDQ分治解三维偏序的模板题,以下是关于cdq分治的大概介绍

CDQ的核心就是分为左右两组后,算左边对右边的贡献····

但CDQ分治运用最广泛的是解决偏序的问题···比如上面的陌上花开就是解决关于(a,b,c)的三维偏序问题····

解决这类问题的核心是降维···一个一个忽略每一维影响···比如这道题,先以a优先排序,从而只用管b和c···然后在分成左右两组时每组以b优先排序··进而最后利用树状数组解决c

详细见:http://www.cnblogs.com/mlystdcall/p/6219421.html

不得不说真神奇·····

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=1e5+;
const int M=2e5+;
inline int R()
{
char c;int f=,i=;
for(c=getchar();(c<''||c>'')&&c!='-';c=getchar());
if(c=='-') i=-,c=getchar();
for(;c<=''&&c>='';c=getchar())
f=(f<<)+(f<<)+c-'';
return f*i;
}
struct node
{
int x,y,z,cnt,ans;
}f[N],a[N];
bool cmp(node a,node b)
{
if(a.x==b.x&&a.y==b.y) return a.z<b.z;
else if(a.x==b.x) return a.y<b.y;
else return a.x<b.x;
}
int m,n,k,tot,tree[M],ans[N];
inline bool operator < (node a,node b)
{
if(a.y==b.y) return a.z<b.z;
else return a.y<b.y;
}
inline void insert(int u,int w)
{
for(int i=u;i<=k;i+=(i&(-i)))
tree[i]+=w;
}
inline int query(int u)
{
int temp=;
for(int i=u;i>;i-=(i&(-i)))
temp+=tree[i];
return temp;
}
inline void solve(int l,int r)
{
if(l==r) return;
int mid=(l+r)/,i,j;
solve(l,mid),solve(mid+,r);
sort(a+l,a+mid+);sort(a+mid+,a+r+);
i=l,j=mid+;
while(j<=r)
{
while(i<=mid&&a[i].y<=a[j].y)
{
insert(a[i].z,a[i].cnt);i++;
}
a[j].ans+=query(a[j].z);j++;
}
for(j=l;j<i;j++) insert(a[j].z,-a[j].cnt);
}
int main()
{
//freopen("a.in","r",stdin);
m=R(),k=R();
for(int i=;i<=m;i++)
{
f[i].x=R();f[i].y=R();f[i].z=R();
}
sort(f+,f+m+,cmp);
a[++n]=f[];tot=;
a[].cnt=;
for(int i=;i<=m;i++)
{
if(f[i].x!=f[i-].x||f[i].y!=f[i-].y||f[i].z!=f[i-].z) ++n,tot=;
else tot++;
a[n]=f[i],a[n].cnt=tot;
}
solve(,n);
for(int i=;i<=n;i++)
ans[a[i].ans+a[i].cnt-]+=a[i].cnt;
for(int i=;i<m;i++)
printf("%d\n",ans[i]);
return ;
}

算法复习——cdq分治的更多相关文章

  1. 【算法】CDQ分治 -- 三维偏序 & 动态逆序对

    初次接触CDQ分治,感觉真的挺厉害的.整体思路即分而治之,再用之前处理出来的答案统计之后的答案. 大概流程是(对于区间 l ~ r): 1.处理 l ~mid, mid + 1 ~ r 的答案: 2. ...

  2. 算法笔记--CDQ分治 && 整体二分

    参考:https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 前置技能:树 ...

  3. 算法复习——平面分治(hud1007)

    题目: 问题描述 : Have you ever played quoit in a playground? Quoit is a game in which flat rings are pitch ...

  4. 算法复习——序列分治(ssoj光荣的梦想)

    题目: 题目描述 Prince对他在这片大陆上维护的秩序感到满意,于是决定启程离开艾泽拉斯.在他动身之前,Prince决定赋予King_Bette最强大的能量以守护世界.保卫这里的平衡与和谐.在那个时 ...

  5. BZOJ1173 CDQ分治 笔记

    目录 二维数据结构->cdq 预备知识 T1: 二维树状数组 T2:cdq分治 bzoj1176 mokia:Debug心得 一类特殊的CDQ分治 附: bzoj mokia AC代码 二维数据 ...

  6. 【BZOJ3237】【AHOI2013】连通图 [CDQ分治]

    连通图 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description Input Output Sampl ...

  7. CDQ 分治

    引言: 什么是CDQ分治?其实这是一种思想而不是具体算法,因此CDQ分治覆盖的范围相当广泛,在 OI 界初见于陈丹琦 2008 年的集训队作业中,故被称为CDQ分治. 大致分为三类: cdq分治解决与 ...

  8. 【算法学习】【洛谷】cdq分治 & P3810 三维偏序

    cdq是何许人也?请参看这篇:https://wenku.baidu.com/view/3b913556fd0a79563d1e7245.html. 在这篇论文中,cdq提出了对修改/询问型问题(Mo ...

  9. CDQ分治--用时间降维的美丽算法

    CDQ分治–用时间降维的美丽算法 CDQ分治,网上的阐述很多,太专业性的文字我就不赘述,这里指谈谈自己的感受 还是%一下CDQ大神的论文 CDQ分治的主要想法就是降维(比如三维问题降维到二维问题),并 ...

随机推荐

  1. log4sql介绍

    log4sql介绍log4j环境中简单配置的情况下可收集执行的SQL语句和JDBC执行情况,如预编译的”?“显示成参数的实际值 下载log4sql.jar第一步:http://log4sql.sour ...

  2. Mybatis Cache 缓存策略

    Mybatis Cache 缓存策略 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的支持 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用 ...

  3. 美可能排除中国大陆制造/生产的所有5G产品

    https://www.wsj.com/articles/u-s-considers-requiring-5g-equipment-for-domestic-use-be-made-outside-c ...

  4. 【414】Code::Blocks增加主题

    替换文件地址:C:\Users\z5194293\AppData\Roaming\CodeBlocks 文件下载地址:default.rar 通过 Settings -> Editor... - ...

  5. idea快速生成实体类Entity

    1)打开idea 2)添加mysql的数据连接 3)生成类

  6. _IO_FILE

    hctf2017的babyprintf解法是house of orange,深入学习了一下,牵扯出许多知识,这里先进行第一步:_IO_FILE结构 0x00 _IO_FILE glibc-2.2.1\ ...

  7. shell脚本,按单词出现频率降序排序。

    [root@localhost oldboy]# cat file the squid project provides a number of resources toassist users de ...

  8. 初涉KMP算法

    久仰字符串系列理论 KMP 讲解(引用自bzoj3670动物园) 某天,园长给动物们讲解KMP算法. 园长:“对于一个字符串S,它的长度为L.我们可以在O(L)的时间内,求出一个名为next的数组.有 ...

  9. PHP发送邮件标题乱码的解决

    遇到问题:PHPMailer发送邮件时中文乱码,本来我的系统都是英文内容的,后来需求变化需要在标题中添加中文,但是在使用安卓自带邮件工具收取是出现乱码,而使用QQ邮箱查看确实正常的. 解决方法: 先用 ...

  10. python列表的增删改查用法

    列表,元组 查 索引(下标) ,都是从0开始 切片 .count 查某个元素的出现次数 .index 根据内容找其对应的位置 "haidilao ge" in a 增加 a.app ...