【BZOJ3262】陌上花开 (CDQ分治+树状数组+排序)
Time Limit: 3000 ms Memory Limit: 256 MB
Description
有n朵花,每朵花有三个属性:花形(s)、颜色(c)、气味(m),用三个整数表示。
现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。
定义一朵花A比另一朵花B要美丽,当且仅当 $S_a \ge S_b, C_a \ge C_b, M_a \ge M_b$。
显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。
Input
第一行为 N,K 分别表示花的数量和最大属性值。
以下 N 行,每行三个整数 $s_i , c_i , m_i$ 表示第i朵花的属性。
Output
包含 $N$ 行,分别表示评级为 $0…N−1$ 的每级花的数量。
Sample Input |
Sample Output |
10 3 |
3 |
题解
题目大意为,给定n个三元组,每个三元组的等级为小于等于它的三元组的个数。
其中“小于”定义为:对于两个三元组$A(s1,c1,m1)$与$B(s2,c2,m2)$,$A \le B$当且仅当$s_1 \le s_2$且$c_1 \le c_2$
且$m_1 \le b_2$。
隐隐约约想到单调性的问题。
1. 对于$s$,我们直接排序处理(按照$s$第一,$c$第二,$m$第三的优先级排序);
2. 对于$c$,开始使用CDQ分治瞎搞(其中每次回溯的时候分别对左右区间,以$c$为第一关键字排序,为计算左区间对右区间的贡献作准备);
3. 对于$m$:我们在CDQ分治时,已经确定左半边区间的$s$是小于右半边区间的;这时采用双指针扫描,以右区间指针指向的三元组为基准三元组。考虑此时 $c$ 是递增的,我们就将左区间的指针移到最靠右的三元组,使得这个三元组的$c$值不超过基准三元组的$c$值;
其中,我们一边扫描左区间一边将左区间扫过的三元组的$m$值丢进树状数组里,左指针到基准时,直接询问树状数组内小于等于与基准三元组的$m$值。
完全相同的几朵花怎么办? 我们按照上面提到的排序方法排序所有花,对于相同的花,将它们的等级都标记为相同花的中等级最高的即可。
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=1e5+,K=2e5+;
int n,k,ans[N];
struct Flower{int s,c,m,sum;}f[N];
struct Bit{
int arr[K],lis[N],cnt;
void reset(){
for(;cnt;cnt--) add(lis[cnt],-,);
}
void add(int u,int num,int flag){
if(!u) return;
if(!flag)
lis[++cnt]=u;
for(;u<=k;u+=u&-u) arr[u]+=num;
}
int que(int u){
int ret=;
for(;u;u-=u&-u) ret+=arr[u];
return ret;
}
}bit;
bool cmpAll(Flower x,Flower y){
if(x.s!=y.s) return x.s<y.s;
if(x.c!=y.c) return x.c<y.c;
return x.m<y.m;
}
bool cmpC(Flower x,Flower y){return x.c<y.c;}
void cdq(int l,int r){
if(l==r) return;
int mid=(l+r)/;
cdq(l,mid);
cdq(mid+,r);
sort(f+l,f+mid+,cmpC);
sort(f+mid+,f+r+,cmpC);
int i=l,j;
bit.reset();
for(i=l,j=mid+;j<=r;j++){
while(i<=mid&&f[i].c<=f[j].c){
bit.add(f[i].m,,);
i++;
}
f[j].sum+=bit.que(f[j].m);
}
}
int main(){
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++)
scanf("%d%d%d",&f[i].s,&f[i].c,&f[i].m);
sort(f+,f++n,cmpAll);
cdq(,n);
sort(f+,f++n,cmpAll);
for(int i=;i<=n;){
int j=i,maxs=;
while(f[i].s==f[j].s&&f[i].c==f[j].c&&f[i].m==f[j].m){
maxs=max(maxs,f[j].sum);
j++;
}
ans[maxs]+=j-i;
i=j;
}
for(int i=;i<=n-;i++)
printf("%d\n",ans[i]);
return ;
}
神奇代码
【BZOJ3262】陌上花开 (CDQ分治+树状数组+排序)的更多相关文章
- bzoj3262: 陌上花开(cdq分治+树状数组)
3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...
- [Bzoj3262]陌上花开(CDQ分治&&树状数组||树套树)
题目链接 题目就是赤裸裸的三维偏序,所以用CDQ+树状数组可以比较轻松的解决,但是还是树套树好想QAQ CDQ+树状数组 #include<bits/stdc++.h> using nam ...
- 【bzoj3262】陌上花开 CDQ分治+树状数组
题目描述 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当且仅当Sa&g ...
- bzoj 3262 陌上花开 - CDQ分治 - 树状数组
Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义一朵花A比另一朵花B要美丽,当 ...
- BZOJ_3262_陌上花开_CDQ分治+树状数组
BZOJ_3262_陌上花开_CDQ分治+树状数组 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),用三个整数表示. 现在要对每朵花评级,一朵花的级别是它拥有的 ...
- 【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分治却可以非常好 ...
- 【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 ...
随机推荐
- 看懂 ,学会 .NET 事件的正确姿势
一.事件的本质 举个例子你是个取向正常的青年男性,有个身材火辣,年轻貌美,腿长肤白的美女,冲你一笑,给你讲了一个ABCD羊吃草的故事.你有什么反应?可能你关注点在于颜值,身材,故事,故事含 ...
- 一步一步学Vue(二)
接上篇,在本篇中,我们将要实现如下,功能,编辑和查询,我们当前的todolist程序,和线上其它的demo程序不同,我们会对其进行增删改查的基本操作,之后进行进一步的完善,按照常规的系统使用经验,一般 ...
- CSS预编译与PostCSS以及Webpack构建CSS综合方案
CSS全称Cascading Style Sheets(层叠样式表),用来为HTML添加样式,本质上是一种标记类语言.CSS前期发展非常迅速,1994年哈肯·维姆·莱首次提出CSS,1996年12月W ...
- c++动态内存管理
一.内存的简要了解 说到内存,很多人应该都多多少少有点了解了,我们在这再稍微多说几句: 一般我们可以把内存理解为三个部分:静态区,栈,堆.有些朋友搞不清到底什么是栈什么是堆,堆栈有多人会认为是堆和栈, ...
- MySQL数据库“十宗罪”(十大经典错误案例)
Top 1: Too many connections(连接数过多,导致连接不上数据库,业务无法正常进行) 问题还原 1 2 3 4 5 6 mysql> show variables lik ...
- 华为OJ之放苹果
题目描述: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法.输入每个用例包含二个整数M和N.0<=m< ...
- 第2章 rsync(一):基本命令和用法
本文目录: 2.1 说在前面的话 2.2 rsync同步基本说明 2.3 rsync三种工作方式 2.4 选项说明和示例 2.4.1 基础示例 2.4.2 "--exclude"排 ...
- python数据可视化(matplotlib)
- C语言基础 - 实现动态数组并增加内存管理
用C语言实现一个动态数组,并对外暴露出对数组的增.删.改.查函数 (可以存储任意类型的元素并实现内存管理) 这里我的编译器就是xcode 分析: 模拟存放 一个 People类 有2个属性 字符串类型 ...
- HTML5 开发APP(打开相册以及图片上传)
我们开发app,常常会遇到让用户上传文件的功能.比如让用户上传头像.我公司的业务要求是让用户上传支付宝收款二维码,来实现用户提现的功能.想要调用相册要靠HTML Plus来实现.先上效果图 基本功能是 ...