【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述
输入
输出
样例输入
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
样例输出
3
1
3
0
1
0
1
0
0
1
题解
CDQ分治+树状数组
先将第一维排序,直接干掉第一维,然后第二维使用CDQ分治。
按照CDQ分治的思(tao)路,将所求区间[l,r]化为两个子区间[l,mid]和[mid+1,r],先处理左边,再处理右边,最后处理左边对右边的影响。
将[l,mid]和[mid+1,r]按照第二维排序,然后寻找左区间左端和右区间左端的y值哪个小。如果左边小(包括等于),就把左边的第三维加到树状数组中,左区间左端+1;否则查询第三维以下的个数加入答案中,右区间左端+1,最后再在树状数组中减回去(CDQ分治绝对不能使用memset!)。
因为本题是对区间的处理,所以我使用了归并排序,亲测快排时间是这个的3倍左右。
排序会改变次序,所以需要使用结构体储存num。
然后由每个元素的num得到num为某值的个数即可。
由于题目中可能存在三维都相同的两个元素,所以必须先去重,统计个数;计算答案时要把这些相同的也算在内。
#include <cstdio>
#include <algorithm>
using namespace std;
struct data
{
int x , y , z , num , cnt;
}a[100010] , v[100010] , tmp[100010];
int n , k , tot , f[200010] , ans[100010];
bool cmp(data a , data b)
{
return a.x == b.x ? (a.y == b.y ? a.z < b.z : a.y < b.y) : a.x < b.x;
}
void update(int x , int a)
{
int i;
for(i = x ; i <= k ; i += i & -i) f[i] += a;
}
int query(int x)
{
int i , ans = 0;
for(i = x ; i ; i -= i & -i) ans += f[i];
return ans;
}
void solve(int l , int r)
{
if(l == r) return;
int mid = (l + r) >> 1 , i = l , j = mid + 1 , p = l;
solve(l , mid) , solve(mid + 1 , r);
while(i <= mid || j <= r)
{
if(i <= mid && (j > r || v[i].y <= v[j].y)) tmp[p ++ ] = v[i] , update(v[i].z , v[i].cnt) , i ++ ;
else tmp[p] = v[j] , tmp[p ++ ].num += query(v[j].z) , j ++ ;
}
for(i = l ; i <= mid ; i ++ ) update(v[i].z , -v[i].cnt);
for(i = l ; i <= r ; i ++ ) v[i] = tmp[i];
}
int main()
{
int i;
scanf("%d%d" , &n , &k);
for(i = 1 ; i <= n ; i ++ ) scanf("%d%d%d" , &a[i].x , &a[i].y , &a[i].z);
sort(a + 1 , a + n + 1 , cmp);
for(i = 1 ; i <= n ; i ++ )
{
if(a[i].x != a[i - 1].x || a[i].y != a[i - 1].y || a[i].z != a[i - 1].z) v[++tot] = a[i];
v[tot].cnt ++ ;
}
solve(1 , tot);
for(i = 1 ; i <= tot ; i ++ ) ans[v[i].num + v[i].cnt - 1] += v[i].cnt;
for(i = 0 ; i < n ; i ++ ) printf("%d\n" , ans[i]);
return 0;
}
【bzoj3262】陌上花开 CDQ分治+树状数组的更多相关文章
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
- [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)
题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- 【BZOJ4553】[Tjoi2016&Heoi2016]序列 cdq分治+树状数组
[BZOJ4553][Tjoi2016&Heoi2016]序列 Description 佳媛姐姐过生日的时候,她的小伙伴从某宝上买了一个有趣的玩具送给他.玩具上有一个数列,数列中某些项的值可能 ...
- BZOJ 1176 Mokia CDQ分治+树状数组
1176: [Balkan2007]Mokia Time Limit: 30 Sec Memory Limit: 162 MBSubmit: 1854 Solved: 821[Submit][St ...
- 【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 ...
- BZOJ 2683 简单题 cdq分治+树状数组
题意:链接 **方法:**cdq分治+树状数组 解析: 首先对于这道题,看了范围之后.二维的数据结构是显然不能过的.于是我们可能会考虑把一维排序之后还有一位上数据结构什么的,然而cdq分治却可以非常好 ...
- LOJ3146 APIO2019路灯(cdq分治+树状数组)
每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
随机推荐
- python3.5怎么打包编译
问题:用Python开发的小工具有时需要编译打包为Windows(*.exe).Mac等操作系统下的可执行性文件以供非程序员使用. 解决方案: 一.py2exe 目前只支持到Python3.4,暂不支 ...
- MB/s与Mbit/s的区别
数据传输率的单位一般采用MB/s或Mbit/s,尤其在内部数据传输率上官方数据中更多的采用Mbit/s为单位.此处有必要讲解一下两个单位二者之间的差异: MB/s的含义是兆字节每秒,Mbit/s的含义 ...
- BootStrap的动态模态框及静态模态框
1.要用bootStrap这个框架就必须要重载它的class类,也就是说class要一样 代码如下: 有疑问的可以在下面留言,欢迎大家一起交流 1.1动态模态框 <!DOCTYPE html&g ...
- PHP Laravel 5.4 环境搭建
1.php运行环境搭建 在win10系统上进行搭建的,使用的是wamp环境 wampserver3_x86_apache2.4.17_mysql5.7.9_php5.6.15.exe,安装包中集成了 ...
- 如何用Python做自动化特征工程
机器学习的模型训练越来越自动化,但特征工程还是一个漫长的手动过程,依赖于专业的领域知识,直觉和数据处理.而特征选取恰恰是机器学习重要的先期步骤,虽然不如模型训练那样能产生直接可用的结果.本文作者将使用 ...
- 新手学习ARM,对片内ram、SDRAM、NOR FLASH和NAND FLASH启动这几个概念的理解
片内的ram用来存储启动代码,在2440初始化sdram之前,代码就在片内ram中运行.片内ram装载的是norflash中的内容,即u-boot. uboot放在norflash里,nandflas ...
- C语言实例解析精粹学习笔记——34(用“结构”统计学生成绩)
实例34: 设学生信息包括学号.姓名和五门功课的成绩,要求编写输入输出学生信息的函数.在输入学生信息后,以学生成绩的总分从高到低顺序输出学生信息. 思路: 程序引入一个结构数组依次存储输入的学生信息, ...
- Test类实验
package PC_TEST; class CPU{ int speed; CPU(){ speed=0; } CPU(int k){ speed=k; } void setSpeed(int k) ...
- Overview of the High Efficiency Video Coding (HEVC) Standard阅读笔记
1.INTRODUCTION High Efficiency Video Coding(HEVC) <-> H.265 MPEG-4 Advanced Video Coding(AVC) ...
- R语言绘图:在地图上绘制热力图
使用ggplot2在地图上绘制热力图 ######*****绘制热力图代码*****####### interval <- seq(0, 150000, 25000)[-2] #设置价格区间 n ...