http://www.lydsy.com/JudgeOnline/problem.php?id=3262

https://www.luogu.org/problemnew/show/3810

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

——————————————————————————

CDQ分治不那么裸的题吧……?可能我菜。

(事实证明三维偏序是CDQ最常见的表现形式……我是真的菜)

首先如果我们做过POJ2532的话, 那这题的思路就不难想:我们对一个维度进行排序,对于另一个维度树状数组统计比它晓得个数有几个,那我们就能够确定它的等级。

不幸的是,这题有三个维度,排掉一个还剩两个,总不能树状数组套树状数组吧(我也不会写啊……)

这时候我们就想到了神奇的CDQ分治(点击此处获得原理),但是这并没有查询和修改操作啊……

好的我们开始对题目重新理解一下!

首先定义我们的修改操作就是往树状数组里添加/删除节点,我们的查询操作就是查询该点的等级。

那么对于一维肯定是要排序的,在那之后我们把根据一维排好的序当做查询/修改的时间,于是我们就神奇的变成了:先询问(该点等级),再修改(将节点插入)的在线问题。

那么CDQ就可以上了!我们对每个区间的节点的二维排序之后套树状数组查三维即可。

PS1:CDQ具体做法:我们每次添加区间前一半的点,后一半进行查询(原因不好用语言表达,大致意思为一个点到区间前端的这段区间可以由若干个CDQ区间的整个前半组成)

PS2:本题还有一个坑点,即相同的点也算是比自己丑(……),而树状数组对于一串相同的点的查询,只有最后一个点的答案正确,其他的点的答案分别为:倒数第二与ans差1,倒数第三与ans差2……所以我们预处理一下即可。

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<queue>
  4. #include<cctype>
  5. #include<cstring>
  6. #include<vector>
  7. #include<algorithm>
  8. using namespace std;
  9. typedef long long ll;
  10. const int N=;
  11. inline int read(){
  12. int X=,w=; char ch=;
  13. while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
  14. while(isdigit(ch)) X=(X<<)+(X<<)+(ch^),ch=getchar();
  15. return w?-X:X;
  16. }
  17. struct flower{
  18. int x;
  19. int y;
  20. int z;
  21. int num;
  22. int ans;
  23. }a[N],b[N];
  24. int ans[N],tree[*N],n,k;
  25. bool cmp(flower a,flower b){
  26. return (a.x<b.x)||(a.x==b.x&&(a.y<b.y||(a.y==b.y&&a.z<b.z)));
  27. }
  28. bool same(flower a,flower b){
  29. return (a.x==b.x&&a.y==b.y&&a.z==b.z);
  30. }
  31. inline int lowbit(int t){return t&(-t);}
  32. void add(int x,int y){//将a[x]+y
  33. for(int i=x;i<=k;i+=lowbit(i))tree[i]+=y;
  34. return;
  35. }
  36. int query(int x){//1-x区间和
  37. int res=;
  38. for(int i=x;i>;i-=lowbit(i))res+=tree[i];
  39. return res;
  40. }
  41. void cdq(int l,int r){
  42. if(l>=r)return;
  43. int mid=(l+r)>>;
  44. cdq(l,mid);cdq(mid+,r);
  45. for(int i=l,j=l,p=mid+;i<=r;i++){
  46. if(j<=mid&&(p>r||a[j].y<=a[p].y))b[i]=a[j++];
  47. else b[i]=a[p++];
  48. }
  49. for(int i=l;i<=r;i++){
  50. a[i]=b[i];
  51. if(a[i].num<=mid)add(a[i].z,);
  52. else a[i].ans+=query(a[i].z);
  53. }
  54. for(int i=l;i<=r;i++)if(a[i].num<=mid)add(a[i].z,-);
  55. return;
  56. }
  57. int main(){
  58. n=read();
  59. k=read();
  60. for(int i=;i<=n;i++){
  61. a[i].x=read();
  62. a[i].y=read();
  63. a[i].z=read();
  64. }
  65. sort(a+,a+n+,cmp);
  66. flower t;int cnt=;
  67. for(int i=n;i>=;i--){
  68. if(same(t,a[i])){
  69. a[i].ans+=cnt;
  70. cnt++;
  71. }
  72. else{
  73. t=a[i];
  74. cnt=;
  75. }
  76. }
  77. for(int i=;i<=n;i++)a[i].num=i;
  78. cdq(,n);
  79. for(int i=;i<=n;i++)ans[a[i].ans]++;
  80. for(int i=;i<n;i++)printf("%d\n",ans[i]);
  81. return ;
  82. }

BZOJ3262:陌上花开 & 洛谷3810:三维偏序——题解的更多相关文章

  1. [bzoj] 3263 陌上花开 洛谷 P3810 三维偏序|| CDQ分治 && CDQ分治讲解

    原题 定义一个点比另一个点大为当且仅当这个点的三个值分别大于等于另一个点的三个值.每比一个点大就为加一等级,求每个等级的点的数量. 显然的三维偏序问题,CDQ的板子题. CDQ分治: CDQ分治是一种 ...

  2. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  3. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  4. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  5. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  6. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  7. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  8. BZOJ.3262.陌上花开([模板]CDQ分治 三维偏序)

    题目链接 BZOJ3262 洛谷P3810 /* 5904kb 872ms 对于相邻x,y,z相同的元素要进行去重,并记录次数算入贡献(它们之间产生的答案是一样的,但不去重会..) */ #inclu ...

  9. 【洛谷P3410】拍照题解(最大权闭合子图总结)

    题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...

随机推荐

  1. stl源码分析之allocator

    allocator封装了stl标准程序库的内存管理系统,标准库的string,容器,算法和部分iostream都是通过allocator分配和释放内存的.标准库的组件有一个参数指定使用的allocat ...

  2. KEIL5的安装

    安装注意事项 1.最好不要安装在带有中文路径的文件夹. 2.试用版的Keil MDK只能编译32K以下的代码,代码大于32K只能使用正版或破解版才能编译通过. 安装MKD 这里选择MKD512A版本安 ...

  3. TW实习日记:第七天

    今天早上,将项目的两个企业微信接口:登录和应用消息发送接口,做了最后的收尾工作,把目前我能解决的问题算是基本都解决了.早上还开了一个会,大意是组长封装了许多组件叫我们使用,在不断的使用中打磨组件的可用 ...

  4. Spring Task中的定时任务无法注入service的解决办法

    1.问题 因一个项目(使用的是Spring+SpringMVC+hibernate框架)需要在spring task定时任务中调用数据库操作,在使用 @Autowired注入service时后台报错, ...

  5. PPM、PGM、PBM图像格式剖析

    今天突然需要用到PPM这个图像文件格式,之前没见过,在此记录一下. PPM.PGM.PBM这三个图像文件格式很少见,其实也不难,分别用于彩色图像.灰度图像.二值图像.这里以PPM格式为例. PPM格式 ...

  6. Sublime Text 3高效实用快捷键

    2017-11-27 16:18:48 Sublime Text 3 高效实用快捷键 Sublime Text 3 软件及注册码 官网下载链接在这里,有时候会很神奇的上不去,可能是因为被Q了,可能就是 ...

  7. Java中的网络编程-3

    用户数据协议(UDP)是网络信息传输的另外一种形式, 基于UDP的通信不同于基于TCP的通信, 基于UDP的信息传递更快, 但是不提供可靠的保证. 使用UDP传输数据时, 用户无法知道数据能否正确地到 ...

  8. Alpha-9

    前言 失心疯病源9 团队代码管理github 站立会议 队名:PMS 530雨勤(组长) 今天完成了那些任务 熬夜肝代码 代码签入github 明天的计划 最好能够完成对接环节 准备展示内容 还剩下哪 ...

  9. 全栈https

    前言:在httpd中使用已经被私有CA签署的证书,对外提供一个https服务 配置httpd服务支持使用https 1:配置httpd支持使用ssl,及使用的证书 yum -y install mod ...

  10. 【beta】nice!-------约吧NABCD

    小组名称:nice! 组长:李权 成员:于淼  刘芳芳韩媛媛 宫丽君 项目内容:约跑app(约吧) 约吧APP下载地址: 百度云:链接:http://pan.baidu.com/s/1jHNBR3g ...