三维偏序

就是让第一维有序 然后归并+树状数组求两维

cdq+cdq不会 告辞

#include <bits/stdc++.h>
// #define int long long
#define rep(a , b , c) for(int a = b ; a <= c ; ++ a)
#define Rep(a , b , c) for(int a = b ; a >= c ; -- a)
#define go(u) for(int i = G.head[u] , v = G.to[i] , w = G.dis[i] ; i ; v = G.to[i = G.nxt[i]] , w = G.dis[i]) using namespace std ;
using ll = long long ;
using pii = pair < int , int > ;
using vi = vector < int > ; int read() {
int x = 0 ; bool f = 1 ; char c = getchar() ;
while(c < 48 || c > 57) { if(c == '-') f = 0 ; c = getchar() ; }
while(c > 47 && c < 58) { x = (x << 1) + (x << 3) + (c & 15) ; c = getchar() ; }
return f ? x : -x ;
} template <class T> void print(T x , char c = '\n') {
static char st[100] ; int stp = 0 ;
if(! x) { putchar('0') ; }
if(x < 0) { x = -x ; putchar('-') ; }
while(x) { st[++ stp] = x % 10 ^ 48 ; x /= 10 ; }
while(stp) { putchar(st[stp --]) ; } putchar(c) ;
} template <class T> void cmax(T & x , T y) { x < y ? x = y : 0 ; }
template <class T> void cmin(T & x , T y) { x > y ? x = y : 0 ; } const int _N = 1e6 + 10 ;
struct Group {
int head[_N] , nxt[_N << 1] , to[_N] , dis[_N] , cnt = 1 ;
Group () { memset(head , 0 , sizeof(head)) ; }
void add(int u , int v , int w = 1) { nxt[++ cnt] = head[u] ; to[cnt] = v ; dis[cnt] = w ; head[u] = cnt ; }
} ; const int N = 1e5 + 10 ;
typedef int arr[N] ; int n , k ;
struct Node {
int x , y , z , ans , cnt ;
Node() {}
bool operator < (const Node & other) const {
if(x != other.x) return x < other.x ;
if(y != other.y) return y < other.y ;
return z < other.z ;
}
bool operator == (const Node & other) const {
return (x == other.x) && (y == other.y) && (z == other.z) ;
}
} a[N] , b[N] , tmp[N] ;
struct BIT {
int c[N << 1] , mxk ;
int low(int x) {
return x & - x ;
}
void add(int x , int y) {
if(! x) return ;
for( ; x <= mxk ; x += low(x)) c[x] += y ;
}
int query(int x) {
int ans = 0 ;
for( ; x ; x ^= low(x)) ans += c[x] ;
return ans ;
}
} t ;
bool cmp(Node x , Node y) {
if(x.y != y.y) return x.y < y.y ;
if(x.z != y.z) return x.z < y.z ;
}
void solve(int l , int r){
// printf("%d -> %d\n" , l , r) ;
if(l == r) return ;
int mid = l + r >> 1 ;
solve(l , mid) ; solve(mid + 1 , r) ;
int p = l ; rep(i , mid + 1 , r) {
for( ; b[p].y <= b[i].y && p <= mid ; ++ p) t.add(b[p].z , b[p].cnt) ;
b[i].ans += t.query(b[i].z) ;
}
rep(i , l , p - 1) t.add(b[i].z , -b[i].cnt) ;
merge(b + l , b + mid + 1 , b + mid + 1 , b + r + 1 , tmp , cmp) ;
rep(i , l , r) b[i] = tmp[i - l] ;
// printf("%d -> %d\n" , l , r) ;
}
int ans[N] ;
signed main() {
n = read() ; t.mxk = k = read() ;
rep(i , 1 , n) { a[i].x = read() ; a[i].y = read() ; a[i].z = read() ; }
sort(a + 1 , a + n + 1) ; rep(i , 1 , n) b[i] = a[i] ;
int len = unique(b + 1 , b + n + 1) - b - 1 ; int tp = 1 ;
rep(i , 1 , n) if(a[i] == b[tp]) ++ b[tp].cnt ; else ++ b[++ tp].cnt ;
solve(1 , len) ;
rep(i , 1 , len) { ans[b[i].ans + b[i].cnt - 1] += b[i].cnt ; }
rep(i , 0 , n - 1) print(ans[i]) ;
return 0 ;
}

先咕着

三维偏序[cdq分治学习笔记]的更多相关文章

  1. Luogu 3810 & BZOJ 3262 陌上花开/三维偏序 | CDQ分治

    Luogu 3810 & BZOJ 3263 陌上花开/三维偏序 | CDQ分治 题面 \(n\)个元素,每个元素有三个值:\(a_i\), \(b_i\) 和 \(c_i\).定义一个元素的 ...

  2. CDQ分治学习笔记(三维偏序题解)

    首先肯定是要膜拜CDQ大佬的. 题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai​.b_ibi​.c_ ...

  3. 初学cdq分治学习笔记(可能有第二次的学习笔记)

    前言骚话 本人蒟蒻,一开始看到模板题就非常的懵逼,链接,学到后面就越来越清楚了. 吐槽,cdq,超短裙分治....(尴尬) 正片开始 思想 和普通的分治,还是分而治之,但是有一点不一样的是一般的分治在 ...

  4. CDQ分治学习笔记

    数据结构中的一块内容:$CDQ$分治算法. $CDQ$显然是一个人的名字,陈丹琪(NOI2008金牌女选手) 这种离线分治算法被算法界称为"cdq分治" 我们知道,一个动态的问题一 ...

  5. bzoj3262: 陌上花开 三维偏序cdq分治

    三维偏序裸题,cdq分治时,左侧的x一定比右侧x小,然后分别按y排序,对于左侧元素按y大小把z依次插入到树状数组里,其中维护每个左侧元素对右侧元素的贡献,在bit查询即可 /************* ...

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

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

  7. BZOJ3262 陌上花开 —— 三维偏序 CDQ分治

    题目链接:https://vjudge.net/problem/HYSBZ-3262 3262: 陌上花开 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit ...

  8. BZOJ 3295:[Cqoi2011]动态逆序对(三维偏序 CDQ分治+树状数组)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3295 题意:简单明了. 思路:终于好像有点明白CDQ分治处理三维偏序了.把删除操作看作是插入操作,那 ...

  9. [摸鱼]cdq分治 && 学习笔记

    待我玩会游戏整理下思绪(分明是想摸鱼 cdq分治是一种用于降维和处理对不同子区间有贡献的离线分治算法 对于常见的操作查询题目而言,时间总是有序的,而cdq分治则是耗费\(O(logq)\)的代价使动态 ...

随机推荐

  1. 数学建模之优劣解距法(TOPSIS)

    优劣解距法简称TOPSIS,是一种综合评价方法,利用原始数据反映各评价方案之间的差距 优劣解距法的步骤通常为: 先将原始数据针具做正向化处理,得到正向化矩阵 再对正向化矩阵标准化处理以消除各指标纲量的 ...

  2. 有道词典 Andriod 版本数据格式分析

    其实很简单无聊 基于版本 5.3 分析. 其实也简单分析了有道词典iOS版本,必应词典的各个版本,以及金山词典的各个版本,还有那个一直逍遥法外的林格斯词典. 由于在各个平台上的限制,同一词典的不同版本 ...

  3. 机器学习(ML)七之模型选择、欠拟合和过拟合

    训练误差和泛化误差 需要区分训练误差(training error)和泛化误差(generalization error).前者指模型在训练数据集上表现出的误差,后者指模型在任意一个测试数据样本上表现 ...

  4. Codeforces_835

    A.比较两人总时间. #include<bits/stdc++.h> using namespace std; int s,v1,v2,t1,t2; int main() { ios::s ...

  5. Codeforces_816

    A.不断增加时间,直到符合要求. #include<bits/stdc++.h> using namespace std; int a,b; char c; int f(int x) { ...

  6. Codeforces_799

    A.求两个时间比较一下. #include<bits/stdc++.h> using namespace std; int n,t,k,d; int main() { ios::sync_ ...

  7. css横竖屏适配

    Css做到横竖屏适配:定义两个样式 { @media screen and (orientation: portrait){ Css[竖向定义样式] } @media screen and (orie ...

  8. [PowerShell]Windows服务开启、重启、关闭

    # 获取服务信息 PS C:\Users\Administrator> Get-Service win* Status Name DisplayName ------ ---- -------- ...

  9. asp.net mvc项目实战遇见问题及解决方式----ajax请求500错误,请求多表数据

    ajax请求出现500错误——但是想实现的功能是,把一个页面分成了两份,点击右边导航栏,利用ajax请求,请求数据,在右边出现相应页面,当时使用的是partialAction然后出现了这个500错误, ...

  10. 全文检索框架---Lucene

    一.什么是全文检索 1.数据分类 我们生活中的数据总体分为两种:结构化数据和非结构化数据.   结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等.   非结构化数据:指不定长或无固定格式 ...