标签:div 字母 树状数组 names ret i++ nod print 心态
心态崩了,又因为打错了一个字母调了1个半小时
CDQ分治,一维排序,二维分治,三维树状数组
注意去重,以及对答案的处理
树状数组维护值域真方便
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+7;
int n,k,c[N],nn,cnt[N];
struct node{
int a,b,c,ans=0,sz=0;
}a[N],b[N];
void add(int x,int y){
while(x<=k){
c[x]+=y;
x+=x&-x;
}
}
int ask(int x){
int anss=0;
while(x){
anss+=c[x];
x-=x&-x;
}
return anss;
}
bool cmpa(node x,node y){
return x.a==y.a?(x.b==y.b?x.c<y.c:x.b<y.b):x.a<y.a;
}
bool cmpb(node x,node y){
return x.b==y.b?x.c<y.c:x.b<y.b;
}
void cdq(int L,int R){
if(L==R)return;
int mid=L+R>>1;
cdq(L,mid);
cdq(mid+1,R);
int l=L,r=mid+1;
sort(a+L,a+mid+1,cmpb);
sort(a+mid+1,a+R+1,cmpb);
while(r<=R){
while(a[l].b<=a[r].b&&l<=mid){
add(a[l].c,a[l].sz);
++l;
}
a[r].ans+=ask(a[r].c);
r++;
}
for(int i=l-1;i>=L;i--){
add(a[i].c,-a[i].sz);(把i打成了l我也是佛了)
}
}
int main(){
cin>>nn>>k;
for(int i=1;i<=nn;i++)
scanf("%d%d%d",&b[i].a,&b[i].b,&b[i].c);
sort(b+1,b+1+nn,cmpa);
int sz=0;
for(int i=1;i<=nn;i++){
sz++;
if(b[i].a!=b[i+1].a||b[i].b!=b[i+1].b||b[i].c!=b[i+1].c)
a[++n]=b[i],a[n].sz=sz,sz=0;
}
cdq(1,n);
for(int i=1;i<=n;i++)
cnt[a[i].ans+a[i].sz-1]+=a[i].sz;
for(int i=0;i<nn;i++)
printf("%d\n",cnt[i]);
return 0;
}
标签:div 字母 树状数组 names ret i++ nod print 心态
原文地址:https://www.cnblogs.com/Hikigaya/p/10579052.html