emmmm我能怎么说呢

CDQ分治显然我没法写一篇完整的优秀的博客,因为我自己还不是很明白...

因为这玩意的思想实在是太短了:

fateice如是说道:

如果说对于一道题目的离线操作,假设有n个操作

把n个操作分成两半,可以想到的是,假如说提出上面那半的修改操作,下面那半提出询问操作

那么这些修改操作对下面的询问操作显然是都产生了相同的影响的。

然后对于每一半的操作都这样递归下去,然后就有了CDQ分治处理问题的基本方法

(图片来自fateice大爷的怕怕踢)

但是再往深处说我也不知道该怎么说,等研究的更深入了再把CDQ分治的完整博客写出来吧

如果哪位路过的好心人看见了,记得催更

丢一篇大佬的上古博客:https://www.cnblogs.com/mlystdcall/p/6219421.html(希望大佬不要diss我私自搬他的博客的链接)

下面是题目:

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

emmm读完题目后我们显然的可以想到这是三维偏序的CDQ分治的基本题

然后就是对一维排序,对第二维CDQ分治,同时用树状数组处理第三维

但实际上我是把这题当成学习板子的板子题写的,所以我代码基本是学习别人的...

这题比较坑的地方是,对于属性值完全相同的花来说,各自互相美于对面,

这就好像你和你的几个克隆体站在一起,你比你的克隆体们聪明,你的克隆体们比你的克隆体们聪明,你的克隆体们又比你聪明...

或者说是,你把一份代码复制成数份,然后你的代码比你的代码优秀,你的代码又比你的代码优秀..

处理方式简单讲就是先把所有属性值相同的花都记一个数量,然后当做一种花处理,最后处理评级时再给加上...

总之具体处理过程还是看代码吧...至少代码里有注释....

 #include<bits/stdc++.h>
#define ll long long
#define uint unsigned int
#define ull unsigned long long
using namespace std;
const int maxn = ;
struct Query {
int s, c, m;
int num, sum;
bool operator < (const Query &A) const {
return c == A.c ? m < A.m : c < A.c;
}
bool operator != (const Query &A) const {
return s != A.s || c != A.c || m != A.m;
}
}a[maxn], q[maxn];
int n, k, cnt = , top = ;
int c[maxn << ];
int ans[maxn]; inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) + ch - '';
ch = getchar();
}
return x * y;
} inline bool cmp(Query x, Query y) {//按第一维排序
if(x.s == y.s && x.c == y.c) return x.m < y.m;
else if(x.s == y.s) return x.c < y.c;
return x.s < y.s;
} inline int ask(int x) {
int res = ;
for(; x; x -= (x & -x)) res += c[x];
return res;
} inline void add(int x, int y) {
for(; x <= k; x += (x & -x)) c[x] += y;
} void solve(int l, int r) {
if(l == r) return;
int mid = l + r >> ;
solve(l, mid), solve(mid + , r);
sort(q + l, q + mid + );//排序,让我sb的卡了会,因为不知道sort的排序是左闭右开
sort(q + mid + , q + r + );
int x = l;
for(int i = mid + ; i <= r; ++i) {//用左边区间的答案导出右边区间的答案
while(x <= mid && q[x].c <= q[i].c) add(q[x].m, q[x].num), x++;//确定了前两维的顺序时,将q[x].m赋上该品种的花的数量,方便右边区间查询
q[i].sum += ask(q[i].m);//查询
}
for(int i = l; i < x; ++i) add(q[i].m, -q[i].num);//还原树状数组
} int main() {
n = read(), k = read();
for(int i = ; i <= n; ++i)
a[i].s = read(), a[i].c = read(), a[i].m = read();
sort(a + , a + n + , cmp);
for(int i = ; i <= n; ++i) {
cnt++;
if(a[i] != a[i + ]) {
q[++top] = a[i];
q[top].num = cnt;//对于某一品种花有多少个
cnt = ;
}
}
solve(, top);
for(int i = ; i <= top; ++i) ans[q[i].sum + q[i].num - ] += q[i].num;
//一朵花的评级=该朵花的美丽值超越的花的数量+属性相同的花的总量(包含自己)-1
//因为题目:定义一朵花A比另一朵花B要美丽,当且仅Sa>=Sb,Ca>=Cb,Ma>=Mb。
for(int i = ; i < n; ++i) printf("%d\n", ans[i]);
//评级可能有0的
return ;
}

BZOJ3262陌上花开(三维偏序问题(CDQ分治+树状数组))+CDQ分治基本思想的更多相关文章

  1. 【bzoj3262】陌上花开 CDQ分治+树状数组

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

  2. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

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

  3. BZOJ 2683: 简单题(CDQ分治 + 树状数组)

    BZOJ2683: 简单题(CDQ分治 + 树状数组) 题意: 你有一个\(N*N\)的棋盘,每个格子内有一个整数,初始时的时候全部为\(0\),现在需要维护两种操作: 命令 参数限制 内容 \(1\ ...

  4. BZOJ_3262_陌上花开_CDQ分治+树状数组

    BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...

  5. 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组

    [BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...

  6. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

  7. 【bzoj2225】[Spoj 2371]Another Longest Increasing CDQ分治+树状数组

    题目描述 给定N个数对(xi, yi),求最长上升子序列的长度.上升序列定义为{(xi, yi)}满足对i<j有xi<xj且yi<yj. 样例输入 8 1 3 3 2 1 1 4 5 ...

  8. BZOJ 1176 Mokia CDQ分治+树状数组

    1176: [Balkan2007]Mokia Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 1854  Solved: 821[Submit][St ...

  9. BZOJ 4553 [Tjoi2016&Heoi2016]序列 ——CDQ分治 树状数组

    考虑答案的构成,发现是一个有限制条件的偏序问题. 然后三个维度的DP,可以排序.CDQ.树状数组各解决一维. #include <map> #include <cmath> # ...

  10. BZOJ 2683 简单题 cdq分治+树状数组

    题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...

随机推荐

  1. Linux下帮助命令

    帮助命令(各种命令区别)   最常用的帮助命令   help --help help cd 查看内置命令的使用 info man   help cd 查看内置命令的使用   获得帮助的途径:   ma ...

  2. redis基础之redis-cluster(集群)(七)

    前言 redis的主流高可用集群模式为redis-cluster.从redis3.0+版本后开始支持,自带集群管理工具redis-trib.rb. 安装redis 参考:https://www.cnb ...

  3. phinx:php数据库迁移

    Phinx使你的php app进行数据迁移的过程变得异常轻松,在五分钟之内你就可以安装好Phinx 并进行数据迁移. 特性 使用php代码进行数据迁移 部署模式下迁移 五分钟之内使用 不再担心数据库的 ...

  4. host与guest间共享文件夹的三种方法(原创)

    一,用samba实现host与guest共享文件 Samba简介:SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通信协议,它为局域网内的不同计算 ...

  5. AJP与HTTP比较和分析

    系统环境: OS:Ubuntu 10.10 (2G) Servlet Container:tomcat-tomcat-7.0.23  (最大内存:default 256M  maxThreads:50 ...

  6. 在html页面中引入公共的头部和底部

    参考链接: http://www.cnblogs.com/jason-star/p/3345225.html http://blog.csdn.net/jsxzzliang/article/detai ...

  7. php直接输出json格式

    php直接输出json格式,很多新手有一个误区,以为用echo json_encode($data);这样就是输出json数据了,没错这样输出文本是json格式文本而不是json数据,正确的写法是应该 ...

  8. Linux下的各类文件

    .a文件是静态链接库文件.所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分.当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了宝贵的内存资源.. ...

  9. python函数库及函数标准库

    一.系统库提供的内部函数 字符函数库: 1)str.islower() :字符串是否全部是小写 2)str.isspace() :字符串是否为空 3)help(str):查询字符串函数库 4)str. ...

  10. 微信小程序-textarea中的文本读取以及换行问题

    今天客户那边要求textarea中输入的问题可以按回车键换行,而我使用的是bindinput获取值,但是呢bindinput 处理函数的返回值并不会反映到 textarea 上,按回车键导致点击换行符 ...