这道题有等于号。
所以要去重,麻烦一点。
#include <iostream>
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <vector>
using namespace std;
#define LL long long
const int N = 2e5+5;
struct node
{
int a,b,c;
int ans,w;
}x[N];
bool cmp1(node a,node b)
{ if(a.a!=b.a)
return a.a<b.a;
if(a.b!=b.b)
return a.b<b.b;
return a.c<b.c;
}
bool cmp2(node a,node b)
{
//if(a.b!=b.b)
return a.b<b.b;
//return a.c<b.c;
}
int num[N<<1];
int n,k;
void add(int x,int p){ while(x<=k){num[x]+=p;x+=x&-x;}}
int query(int x){int ans=0;while(x>=1){ans+=num[x];x-=x&-x;}return ans;}
void merge(int l,int r)
{
if(l>=r) return;
int mid = (l+r)>>1;
merge(l,mid);
merge(mid+1,r);
sort(x+l,x+mid+1,cmp2);
sort(x+mid+1,x+r+1,cmp2);
int i=l,j=mid+1;
for(;j<=r;j++){
while(x[i].b<=x[j].b&&i<=mid){
add(x[i].c,x[i].w);
i++;
}
x[j].ans+=query(x[j].c);
}
for(j=l;j<i;j++)
add(x[j].c,-x[j].w);
}
int ans[N];
node x_[N];
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d%d%d",&x_[i].a,&x_[i].b,&x_[i].c);
x_[i].ans=0;
}
sort(x_+1,x_+1+n,cmp1);
int w=0,cnt=0;
for(int i=1;i<=n;i++){
w++;
if(x_[i].a!=x_[i+1].a || x_[i].b!=x_[i+1].b || x_[i].c!=x_[i+1].c){
x[++cnt]=x_[i],x[cnt].w=w,w=0;
}
}
merge(1,cnt);
for(int i=1;i<=cnt;i++){
ans[x[i].ans+x[i].w-1]+=x[i].w;
}
for(int i=0;i<n;i++)
printf("%d\n",ans[i]);
return 0;
}
本文探讨了一种处理复杂数据结构的算法,通过使用树状数组和归并排序等高级数据结构与算法,实现对大规模数据的有效处理与去重。代码示例展示了如何在C++中实现这一过程,包括树状数组的增删查操作,以及通过归并排序进行数据合并。
404

被折叠的 条评论
为什么被折叠?



