CDQ分治

三维偏序模板题

#include <bits/stdc++.h>
using ll = long long;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n,lim;
std::cin >> n >> lim;
std::vector<std::array<int,5>> a(n ,{0}),ar;
for(int i = 0 ; i < n ; ++i) {
std::cin >> a[i][0] >> a[i][1] >> a[i][2];
}
std::sort(a.begin(),a.end());
for(int i = 0 ; i < n ; ++i) {
int cnt = 1;
while(i + 1 < n && a[i] == a[i + 1]) ++i,++cnt;
a[i][3] = cnt;
ar.push_back({a[i][0] , a[i][1] , a[i][2] , a[i][3] , 0});
}
std::vector<int> tr(lim + 1);
auto lowbit = [&](int x) {
return x & -x;
};
auto add = [&](int x , int v) {
while(x <= lim) {
tr[x] += v;
x += lowbit(x);
}
};
auto query = [&](int x) {
int sum = 0;
while(x) {
sum += tr[x];
x -= lowbit(x);
}
return sum;
};
int m = ar.size();
// for(int i = 0 ; i < m ; ++i) {
// std::cout << ar[i][0] << ' ' << ar[i][1] << ' ' << ar[i][2] << ' ' << ar[i][3] << '\n';
// }
// exit(0);
std::function<void(int,int)> CDQ = [&](int l,int r) {
if(l == r) return;
int mid = l + r >> 1;
CDQ(l , mid) , CDQ(mid + 1 , r);
std::sort(ar.begin() + l , ar.begin() + mid + 1 ,
[&](const std::array<int,5> &x , const std::array<int,5> &y){
return x[1] < y[1];
});
std::sort(ar.begin() + mid + 1 , ar.begin() + r + 1 ,
[&](const std::array<int,5> &x , const std::array<int,5> &y){
return x[1] < y[1];
});
int i = l , j = mid + 1;
while(j <= r) {
while(i <= mid && ar[j][1] >= ar[i][1]) {
add(ar[i][2] , ar[i][3]);
i++;
}
ar[j][4] += query(ar[j][2]);
j++;
}
for(int k = l ; k < i ; ++k)
add(ar[k][2] , -ar[k][3]);
return;
};
CDQ(0 , m - 1);
std::vector<int> f(n , 0);
for(int i = 0 ; i < m ; ++i) {
// std::cout << "*" << i << ' ' << ar[i][0] << ' ' << ar[i][1] << ' '
// << ar[i][2] << ' ' << ar[i][3] << ' ' << ar[i][4] << '\n';
f[ar[i][3] + ar[i][4] - 1] += ar[i][3];
}
//
for(int i = 0 ; i < n ; ++i) {
std::cout << f[i] << '\n';
}
return 0;
}

posted @   xqy2003  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示