最近才学了cdq,所以用cdq写的代码(这道题也是cdq的模板题)

这道题是个三维偏序问题,先对第一维排序,然后去掉重复的,然后cdq分治即可。

为什么要去掉重复的呢?因为相同的元素互相之间都能贡献,而cdq过程中只能左边贡献右边的,所以要去重。

 1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=200005;
4 struct node{
5 int a,b,c,cnt,ans;
6 }s1[N],s2[N];
7 int n,k,mx,m,top,su[N];
8 int c[N];//树状数组
9
10 bool cmp1(node x,node y){//按a排序
11 if(x.a==y.a){
12 if(x.b==y.b) return x.c<y.c;
13 else return x.b<y.b;
14 }
15 else return x.a<y.a;
16 }
17
18 bool cmp2(node x,node y){//cdq分治过程中对b排序
19 if(x.b==y.b) return x.c<y.c;
20 else return x.b<y.b;
21 }
22
23 int lowbit(int x){
24 return x&(-x);
25 }
26
27 void add(int x,int k){
28 while(x<=mx){
29 c[x]+=k;
30 x+=lowbit(x);
31 }
32 }
33
34 int query(int x){
35 int sum=0;
36 while(x){
37 sum+=c[x];
38 x-=lowbit(x);
39 }
40 return sum;
41 }
42
43 void cdq(int l,int r){//cdq
44 if(l==r) return ;
45 int mid=(l+r)>>1;
46 cdq(l,mid);cdq(mid+1,r);
47 sort(s2+l,s2+1+mid,cmp2);
48 sort(s2+mid+1,s2+r+1,cmp2);
49 int i,j=l;
50 for(int i=mid+1;i<=r;i++){//双指针计算结果
51 while(s2[i].b>=s2[j].b&&j<=mid){
52 add(s2[j].c,s2[j].cnt);
53 j++;
54 }
55 s2[i].ans+=query(s2[i].c);//计算ans
56 }
57 for(int i=l;i<j;i++){//清空数组
58 add(s2[i].c,-s2[i].cnt);
59 }
60 }
61
62 int main()
63 {
64 scanf("%d%d",&n,&k);
65 mx=k;
66 for(int i=1;i<=n;i++){
67 int a,b,c;
68 scanf("%d%d%d",&a,&b,&c);
69 s1[i].a=a;s1[i].b=b;s1[i].c=c;
70 }
71 sort(s1+1,s1+1+n,cmp1);
72 for(int i=1;i<=n;i++){//去掉重复的
73 top++;
74 if(s1[i].a!=s1[i+1].a||s1[i].b!=s1[i+1].b||s1[i].c!=s1[i+1].c){
75 m++;
76 s2[m].a=s1[i].a;s2[m].b=s1[i].b;s2[m].c=s1[i].c;
77 s2[m].cnt=top;
78 top=0;
79 }
80 }
81 cdq(1,m);
82 for(int i=1;i<=m;i++) su[s2[i].ans+s2[i].cnt-1]+=s2[i].cnt;
83 for(int i=0;i<n;i++)
84 cout<<su[i]<<endl;
85 return 0;
86 }

洛谷P3810 陌上花开 (cdq)的更多相关文章

  1. 洛谷P3810 陌上花开 CDQ分治(三维偏序)

    好,这是一道三维偏序的模板题 当然没那么简单..... 首先谴责洛谷一下:可怜的陌上花开的题面被无情的消灭了: 这么好听的名字#(滑稽) 那么我们看了题面后就发现:这就是一个三维偏序.只不过ans不加 ...

  2. 洛谷P3810 陌上花开(CDQ分治)

    洛谷P3810 陌上花开 传送门 题解: CDQ分治模板题. 一维排序,二维归并,三维树状数组. 核心思想是分治,即计算左边区间对右边区间的影响. 代码如下: #include <bits/st ...

  3. BZOJ3262/洛谷P3810 陌上花开 分治 三维偏序 树状数组

    原文链接http://www.cnblogs.com/zhouzhendong/p/8672131.html 题目传送门 - BZOJ3262 题目传送门 - 洛谷P3810 题意 有$n$个元素,第 ...

  4. P3810 陌上花开 CDQ分治

    陌上花开 CDQ分治 传送门:https://www.luogu.org/problemnew/show/P3810 题意: \[ 有n 个元素,第 i 个元素有 a_i. b_i. c_i 三个属性 ...

  5. 洛谷 P3810 【模板】三维偏序(陌上花开) (cdq分治模板)

    在solve(L,R)中,需要先分治solve两个子区间,再计算左边区间修改对右边区间询问的贡献. 注意,计算额外的贡献时,两子区间各自内部的顺序变得不再重要(不管怎么样左边区间的都发生在右边之前), ...

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

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

  7. 【洛谷P3810】陌上花开

    题目大意:给定一个三维空间点的坐标,求对于任意一个点三维均小于等于这个点的点个数. 题解:学会了简单的 cdq 分治. 首先,先将第一维从小到大排序,再用类似归并排序的操作对第二维进行排序,在第二维合 ...

  8. [洛谷P3810]【模板】三维偏序(陌上花开)

    题目大意:有$n$个元素,第$i$个元素有三个属性$a_i,b_i,c_i$,设$f(i)=\sum\limits_{i\not = j}[a_j\leqslant a_i,b_j\leqslant ...

  9. 洛谷P4390 Mokia CDQ分治

    喜闻乐见的CDQ分治被我搞的又WA又T..... 大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问.然后施CDQ大法即可. 我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就 ...

随机推荐

  1. TCP通信的概述

  2. 2511-Druid监控功能的深入使用与配置-如何记录监控数据(基于logback)

    Druid的监控很强大,但可惜的是监控数据是存在内存中的,需求就是定时把监控数据记录下来,以日志文件的形式或者数据库入库. 记录两种方式: 数据库入库 logback形式记录 原理(重点) 如果仅仅想 ...

  3. 内网渗透之Windows认证(二)

    title: 内网渗透之Windows认证(二) categories: 内网渗透 id: 6 key: 域渗透基础 description: Windows认证协议 abbrlink: d6b7 d ...

  4. C#async\await组合

    一.概述 编译器提供的便捷功能,就是语法糖.我的理解是为了优化代码.被async修饰的函数被称之为异步函数,主要用于异步编程,着重于靠await实现回调机制. 二.声明 //async用在方法名之前 ...

  5. java日常开发必备:list的四种遍历

      在平时的开发过程中使用List的场景很多,你知道List的遍历有多少种方式?今天一起来梳理下List的几种遍历方式.这里以java.util.ArrayList为例来演示.   这里有一个最简单的 ...

  6. Reactive UI -- 反应式编程UI框架入门学习(二)

    前文Reactive UI -- 反应式编程UI框架入门学习(一)  介绍了反应式编程的概念和跨平台ReactiveUI框架的简单应用. 本文通过一个简单的小应用更进一步学习ReactiveUI框架的 ...

  7. es6中的Proxy和vue中的数据代理的异同

    1:概述 1-1:Proxy 用于修改某些操作的默认行为,Proxy可以说在对对象进行各种访问或者操作的时候在外层进行一层拦截,在操作之前都需要经过这种拦截.proxy返回的是一个新对象,可以通过操作 ...

  8. 关于奉加微PHY62xx系列如何选型?PHY6222/PHY6212/PHY6252

    PHY6252是一款支持BLE 5.2功能的系统级芯片(SOC),集成了低功耗的高性能多模射频收发机,搭载32位高性能低功耗处理器,提供64K retention SRAM.可选512/256K Fl ...

  9. Windows 电脑杀毒简单有效的方式

    Windows 电脑杀毒通常会选择杀毒软件,这样太笨重,且容易占内存和存在流氓软件侵入. 推荐使用 Windows 自带的恶意软件删除工具 按住 Win + R 键,弹出运行窗口,输入 mrt. 系统 ...

  10. 深入分析FragmentPagerAdapter和FragmentStatePagerAdapter

    最近遇到比较奇怪的bug,TableLayout+ViewPager实现点击顶部tab切换viewpager视图.但是在Viewpager设置dapter时,最开始设置的是FragmentPagerA ...