3262: 陌上花开

Time Limit: 20 Sec  Memory Limit: 256 MB
Submit: 1439  Solved: 648
[Submit][Status][Discuss]

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分治

Solution

by CA

和Mokia一样,考虑排序来处理掉一维,然后另一维分治,第三维套上数据结构

首先按s为第一关键字,c、m第二、三关键字排序,然后c维分治,对m维建树状数组。

CDQ(l,r)表示[l,r]中对任意的[l,r]中的x贡献。所以用[l,mid]更新对[mid+1,r]中各元素的贡献。

对c为第一关键字再排序,然后得到[l,mid],[mid+1,r]都是以c维从小到大排序的,把[l,mid]中的x,[mid+1,r]中的y,所有x.c<=y.c的x在他的m上+1,直到x.c>y.c,然后我们Query(y.m)就能得到对y的贡献

统计完还原。

要注意的是:这样有序的分治,我们发现当存在x、y,满足x.s==y.s&&x.c==y.c&&x.m==y.m时,显然排序时靠前的那个,统计答案时会少一个,所以我们需要在分治前去重,额外记录一个个数即可。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1; char ch=getchar();while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}return x*f;
}
#define MAXN 100010
#define MAXK 200010
int N,K,tp,rank[MAXN];
struct FlowersNode
{int s,c,m,n,id,rk;bool operator < (const FlowersNode & A) const{return s==A.s? (c==A.c? m<A.m:c<A.c):s<A.s; }
}f[MAXN],F[MAXN];
bool cmp(FlowersNode A,FlowersNode B) {return A.c==B.c? A.m<B.m:A.c<B.c;}
namespace BIT
{int tree[MAXK];inline int lowbit(int x) {return x&-x;}inline void Change(int pos,int D) {for (int i=pos; i<=K; i+=lowbit(i)) tree[i]+=D;}inline int Query(int pos) {int re=0; for (int i=pos; i; i-=lowbit(i)) re+=tree[i]; return re;}
}
using namespace BIT;
void CDQ(int l,int r)
{if (l==r) {F[l].rk+=F[l].n-1; return;}int mid=(l+r)>>1;CDQ(l,mid); CDQ(mid+1,r);sort(F+l,F+mid+1,cmp); sort(F+mid+1,F+r+1,cmp);
//    for (int i=l; i<=r; i++) printf("%d %d %d %d %d\n",F[i].s,F[i].c,F[i].m,F[i].rk,F[i].n);int pos=l;for (int i=mid+1; i<=r; F[i].rk+=Query(F[i].m),i++)for (int j=pos; j<=mid && F[j].c<=F[i].c; j++,pos++)Change(F[j].m,F[j].n);for (int i=l; i<=pos-1; i++) Change(F[i].m,-F[i].n);sort(F+l,F+r+1,cmp);
}
bool compare(FlowersNode A,FlowersNode B) {return (A.s==B.s)&&(A.c==B.c)&&(A.m==B.m);}
int main()
{N=read(); K=read();for (int i=1; i<=N; i++) f[i].s=read(),f[i].c=read(),f[i].m=read(),f[i].rk=f[i].n=1;sort(f+1,f+N+1);for (int i=1; i<=N; i++) if (compare(f[i],F[tp])) F[tp].n++; else F[++tp]=f[i];CDQ(1,tp);for (int i=1; i<=tp; i++) rank[F[i].rk]+=F[i].n;for (int i=1; i<=N; i++) printf("%d\n",rank[i]);return 0;
}

转载于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5862552.html

【BZOJ-3262】陌上花开 CDQ分治(3维偏序)相关推荐

  1. 陌上花开 HYSBZ - 3262 (CDQ分治)

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

  2. bzoj 3262: 陌上花开(cdq分治)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2433  Solved: 1087 [Submit][Status][Disc ...

  3. BZOJ 3262 陌上花开

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 2590  Solved: 1159 [Submit][Status][Disc ...

  4. bzoj 3262: 陌上花开

    3262: 陌上花开 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 5800 Solved: 2804 [Submit][Status][Discus ...

  5. BZOJ 4285 使者 (CDQ分治+dfs序)

    题目传送门 题目大意:给你一棵树,有三种操作,在两个点之间连一个传送门,拆毁一个已有的传送门,询问两个点之间的合法路径数量.一条合法路径满足 1.经过且仅经过一个传送门 2.不经过起点终点简单路径上的 ...

  6. 【原创】从BZOJ2683 简单题中 整 CDQ分治解决三维偏序

    CDQ分治 题目描述 你有一个N*N的棋盘,每个格子内有一个整数,初始时的时候全部为0,现在需要维护两种操作: 命令 参数限制 内容 1 x y A 1<=x,y<=N,A是正整数 将格子 ...

  7. BZOJ - 3262 陌上花开

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 5433  Solved: 2623 [Submit][Status][Disc ...

  8. bzoj 3262 陌上花开

    本质是一个三维偏序,一位排序后cdq分治,一维在子函数里排序,一维用树状数组维护. 把三维相等的合并到一个里面. 1 #include<iostream> 2 #include<cs ...

  9. BZOJ3262: 陌上花开(cdq分治)

    Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 3627  Solved: 1705 [Submit][Status][Discuss] Descri ...

最新文章

  1. android wear 兼容问题,【悲剧了】仅 1/4 安卓手机兼容 Android Wear - 爱应用
  2. .NET平台开源项目速览-最快的对象映射组件Tiny Mapper之项目实践
  3. 【渝粤题库】国家开放大学2021春1354高级英语阅读(2)题目
  4. web开发软件,8个优秀的CSS实践,附面试题
  5. UINavigationBar的创建
  6. 点对点借贷dApp Yield宣布流动性激励迁移至SushiSwap
  7. 微服务内部方法调用方式
  8. flask中的static_path和static_path_url和static_folder
  9. html插入循环图片,javascript – HTML5在带有for循环的画布上绘制图片?
  10. 345.反转字符串中的元音字母
  11. python论文排版格式_一行代码简化Python异常信息:错误清晰指出,排版简洁美观 | 开源...
  12. 几种常见的模式识别算法整理和总结
  13. bp神经网络回归预测模型(python实现)_bp神经网络预测代码python
  14. Matlab实现无标度网络生成及其分析
  15. APK应用程序的解包、修改、编辑、打包及应用(一)
  16. jsp:include和%@include file=%有什么区别
  17. CLion2020调整字体大小
  18. QQ空间最新免费个人形象设置方法
  19. Zetero引用特定格式参考文献的手把手操作
  20. 会声会影2022智能、快速、简单的视频剪辑软件

热门文章

  1. 画动态分析图的个人小技巧
  2. CTFshow 命令执行 web118
  3. 历届试题 快速排序:
  4. 谱聚类算法(Spectral Clustering)优化与扩展
  5. Dimple.js基础
  6. matlab仿真随机数的产生
  7. 电力系统单机无穷大_电力系统分析(九):电力系统的稳定性分析
  8. ArcGIS案例学习1_2
  9. Spring MVC 全注解配置 (十一)
  10. [BZOJ1130] [POI2008]POD Subdivision of Kingdom