码迷,mamicode.com
首页 > 其他好文 > 详细

陌上花开

时间:2019-03-22 17:05:41      阅读:117      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!