求三维偏序

设三维为a,b,c。先对a排序,这样i的偏序就只能<i。

然而排序的时候需要三个维度都判断一遍,最后还要去重,不然会出现实际应该记答案的数出现在它后面的情况。

(排序用的函数里不要写类似于<=之类的东西啊..会出奇奇怪怪的问题的(RE))

然后分治来做,我们在做区间[l,r]的时候,先去做[l,m]和[m+1,r]

之后左区间[l,m],右区间[m+1,r]都已经按照b排好序了,而且左右两区间内部的答案已经统计过了,所以现在只要考虑左区间中满足(右区间的数)的数量就好了。

那么就也把[l,r]按照b排好序,在排的时候再用一个权值树状数组维护c,

也就是,如果这个点是左区间的点,就把它的c值对应的树状数组中+=这个点的重复数(刚才去重了)

    如果这个点是右区间的点,就询问树状数组中<=它的c值的数量,然后加到这个点的答案里。

而且每次做的时候树状数组都要清空,但不能用memset来清,复杂度有问题。(一直迷信memset的速度,结果一查告诉我也就比循环清快一倍??)

所以只要把刚才加过的再减回去就可以了。

复杂度$O(n*log_2n*log_2k)$

也可以cdq套cdq,然后不用树状数组,复杂度是一样的。

这样一直套下去,k维的话复杂度也就是$O(n*log^{k-1}_2n)$啦

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include<cmath>
#include<ctime>
#define LL long long int
#define inf 0x3f3f3f3f
#define lowbit(x) ((x)&(-(x)))
using namespace std;
const int maxn=,maxk=; LL rd(){
LL x=;char c=getchar();int neg=;
while(c<''||c>''){if(c=='-') neg=-;c=getchar();}
while(c>=''&&c<='') x=x*+c-'',c=getchar();
return x*neg;
} struct Node{
int a,b,c,i;
}inp[maxn],num[maxn],tmp[maxn];
int iniN,N,K;
int tr[maxk],cnt[maxn],siz[maxn],ans[maxn]; inline bool cmp(Node a,Node b){return a.a==b.a?(a.b==b.b?a.c<b.c:a.b<b.b):a.a<b.a;} inline void add(int x,int y){
while(x&&x<=K) tr[x]+=y,x+=lowbit(x);
}
inline int query(int x){
int re=;while(x) re+=tr[x],x-=lowbit(x);return re;
} void cdq(int l,int r){
int m=l+r>>,p=l,q=m+,t=;
if(l>=r) return;
cdq(l,m);cdq(m+,r);
while(p<=m&&q<=r){
if(num[p].b<=num[q].b){
tmp[++t]=num[p];add(num[p].c,siz[num[p].i]);p++;
}else{
tmp[++t]=num[q];cnt[num[q].i]+=query(num[q].c);q++;
}
} while(q<=r){
tmp[++t]=num[q];cnt[num[q].i]+=query(num[q].c);q++;
}for(int i=l;i<p;i++) add(num[i].c,-siz[num[i].i]);
while(p<=m) tmp[++t]=num[p++]; memcpy(num+l,tmp+,sizeof(Node)*t);
} int main(){
int i,j,k;
iniN=N=rd();K=rd();
for(i=;i<=N;i++){
int a=rd(),b=rd(),c=rd();
inp[i].a=a;inp[i].b=b;inp[i].c=c;num[i].i=i;
}
sort(inp+,inp+N+,cmp);//printf("ll");
for(i=,j=;i<=N;i++){
if(inp[i].a==inp[i-].a&&inp[i].b==inp[i-].b&&inp[i].c==inp[i-].c) inp[i].i=j,cnt[j]++,siz[j]++;
else{
inp[i].i=++j;num[j]=inp[i];siz[j]=;
}
}N=j;
cdq(,N);
for(i=;i<=N;i++) ans[cnt[i]]+=siz[i];
for(i=;i<iniN;i++) printf("%d\n",ans[i]);
return ;
}

luogu3810 陌上花开 (cdq分治)的更多相关文章

  1. P3810 陌上花开 CDQ分治

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

  2. 【BZOJ-3262】陌上花开 CDQ分治(3维偏序)

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 1439  Solved: 648[Submit][Status][Discuss ...

  3. bzoj3262陌上花开 cdq分治

    3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 2794  Solved: 1250[Submit][Status][Discus ...

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

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

  5. 【CJOJ2433】陌上花开 CDQ分治

    [CJOJ2433]陌上花开 CDQ呲嘚秋分治 WA果然呲嘚秋分治跑得比树套树还快!!!(md理论复杂度不是一样的吗) 但树套树不知道比呲嘚秋高到哪里去辣装X用 Orz hzwer 第一维sort,第 ...

  6. 【BZOJ3262】陌上花开 cdq分治

    [BZOJ3262]陌上花开 Description 有n朵花,每朵花有三个属性:花形(s).颜色(c).气味(m),又三个整数表示.现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量.定义 ...

  7. bzoj3262: 陌上花开(cdq分治+树状数组)

    3262: 陌上花开 题目:传送门 题解: %%%cdq分治 很强大的一个暴力...感觉比分块高级多了 这道题目就是一个十分经典的三维偏序的例题: 一维直接暴力排序x 二维用csq维护y 三维用树状数 ...

  8. BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

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

  9. bzoj 3262 陌上花开 - CDQ分治 - 树状数组

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

随机推荐

  1. flask-socketio笔记

    Flask-SocketIO使Flask应用程序可以访问客户端和服务器之间的低延迟双向通信. 客户端应用程序可以使用Javascript,C ++,Java和Swift中的任何SocketIO官方客户 ...

  2. Js基础---红宝书读书日记(1)-------基本类型和引用类型

    JS的变量可能包含两种不同数据类型的值,基本类型和引用类型; 基本类型是指简单的数据段,引用类型是指可能由多个值构成的对象; JS高级程序设计第三章介绍了变量分为 5种简单数据类型(string/nu ...

  3. python基础学习笔记(二)

    继续第一篇的内容,讲解,python的一些基本的东西. 注释 为了让别人能够更容易理解程序,使用注释是非常有效的,即使是自己回头再看旧代码也是一样. >>> #获得用户名: > ...

  4. Week 2 代码规范

    Question 1: 这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西. My opinion: 我认为恰恰相反,这个可以提高人们的开发效率. 在团队合作当中,如果 ...

  5. Linux内核期末总结

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 第一周 http://www.cn ...

  6. <<浪潮之巅>>阅读笔记一

    第一次的阅读就想读这本书的,却因为很多愿意一直拖到现在,因为听说这本书在李开复先生 的微博上有推荐,更是增加了我的阅读兴趣.可能是因为在网上找的电子版的原因,通篇阅读的速度很快,但是没有纸质数那种细嚼 ...

  7. 20150401 作业2 结对 四则运算ver 1.0

    Web項目下 Tomcat服務器的路徑 /WebContant/ 目錄下 SE2_2.jsp <%@ page language="java" contentType=&qu ...

  8. Distances to Zero CodeForces - 803B (二分)

    题目链接:https://vjudge.net/problem/CodeForces-803B#author=0 题意: 给你一个数组,其中至少包括一个0,求每一个元素距离最近一个0的距离是多少. 样 ...

  9. Facebook 50%用户是虚假账号?我觉得可以更高!

    0x00 背景 今天下午看新闻时,无意看到一条关于facebook虚假帐号(fake account)消息: 一下子就被这标题吸引了眼球,因为作为一个第三方机构,能够对facebook这样如此海量的帐 ...

  10. php开发APP接口(总结一)

    一.什么是app接口:服务端与客户端的数据交互. 大部分APP接口是通过http协议通信的. http通信的三要素: URL:   通信的地址 Method:通信的方式(get | post | pu ...