luogu3810 【模板】三维偏序(陌上花开)
2024-09-02 11:57:13
#include <algorithm>
#include <iostream>
#include <cstdio>
using namespace std;
int n, k, c[200005], cnt[200005];
struct Node{
int x, y, z, idx, ans;
bool operator==(const Node &u)const{
return x==u.x && y==u.y && z==u.z;
}
}a[100005], qwq, b[100005];
bool cmp(const Node &u, const Node &v){
if(u.x!=v.x) return u.x<v.x;
else if(u.y!=v.y) return u.y<v.y;
else return u.z<v.z;
}
int lb(int x){
return x & -x;
}
void add(int x, int v){
for(; x<=k; x+=lb(x))
c[x] += v;
}
int query(int x){
int re=0;
for(; x; x-=lb(x))
re += c[x];
return re;
}
void cdq(int l, int r){
if(l==r) return ;
int mid=(l+r)>>1;
cdq(l, mid); cdq(mid+1, r);
int jj=l, kk=mid+1;
for(int i=l; i<=r; i++)
if(jj<=mid && (kk>r || a[jj].y<=a[kk].y)) b[i] = a[jj++];
else b[i] = a[kk++];
for(int i=l; i<=r; i++){
a[i] = b[i];
if(a[i].idx<=mid) add(a[i].z, 1);
else a[i].ans += query(a[i].z);
}
for(int i=l; i<=r; i++)
if(a[i].idx<=mid)
add(a[i].z, -1);
}
int main(){
cin>>n>>k;
for(int i=1; i<=n; i++)
scanf("%d %d %d", &a[i].x, &a[i].y, &a[i].z);
sort(a+1, a+1+n, cmp);
int orzwys1996=1;
for(int i=n; i>=1; i--){
if(a[i]==qwq){
a[i].ans += orzwys1996;
orzwys1996++;
}
else{
qwq = a[i];
orzwys1996 = 1;
}
a[i].idx = i;
}
cdq(1, n);
for(int i=1; i<=n; i++)
cnt[a[i].ans]++;
for(int i=0; i<n; i++)
printf("%d\n", cnt[i]);
return 0;
}
最新文章
- AngularJS下拉列表select在option动态变化之后多出了一个错误项的问题
- 限制textarea的字数(包括复制粘贴)
- Android中Intent的用法总结
- kmdjs指令大全
- Web Workers
- 【C#】注意用“划算”的方式使用图标
- Hosting socket.io WebSocket apps in IIS using iisnode
- word中那些重要但是被人忽略的快捷键和长word文档的跳转
- repo 版本回退
- Mac下部署Android开发环境附加NDK
- 第二百四十九天 how can I 坚持
- HDOJ 1097 A hard puzzle(循环问题)
- 【Python】 多线程并发threading &; 任务队列Queue
- Day13 CSS的与应用
- vue + ts @Prop boolean 问题
- bzoj4821-线段树区间lazy_tag下放的优先级和区间覆盖
- IOT-web替换某一个前台版本
- load data妙用
- bzoj千题计划205:bzoj3529: [Sdoi2014]数表
- 阿里云设置CDN加速访问OSS文件