zoukankan      html  css  js  c++  java
  • BZOJ 3262: 陌上花开 [CDQ分治 三维偏序]

    Description

    有n朵花,每朵花有三个属性:花形(s)、颜色(c)、气味(m),又三个整数表示。现要对每朵花评级,一朵花的级别是它拥有的美丽能超过的花的数量。定义一朵花A比另一朵花B要美丽,当且仅当Sa>=Sb,Ca>=Cb,Ma>=Mb。显然,两朵花可能有同样的属性。需要统计出评出每个等级的花的数量。

    Input

    第一行为N,K (1 <= N <= 100,000, 1 <= K <= 200,000 ), 分别表示花的数量和最大属性值。
    以下N行,每行三个整数si, ci, mi (1 <= si, ci, mi <= K),表示第i朵花的属性

    Output

    包含N行,分别表示评级为0...N-1的每级花的数量。

    太坑了!!!!!!!!!
    各种修改比较操作各种修改细节最后发现是因为我去重之后把$n$改变了然而人家输出需要原来的$n$!!!!!!!!!!!!!!!!!
     
    裸的三维偏序
    $a$排序,$b$ $CDQ$分治,$c$树状数组
    一开始$a$排序需要考虑$a,b,c$整体排序,然后分治里$b$排序要用$le$,或者$b,c$整体$le$,注意这里就不关$a$什么事了,分治已经保证用左面更新右面了
    注意需要去重,一个元素代表多个
    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    typedef long long ll;
    const int N=2e5+5;
    inline int read(){
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    int n,maxVal;
    struct Operation{
        int a,b,c,w;
        int f;//ans
        bool operator <(const Operation &r)const{
            //return a<r.a || (a==r.a&&b<r.b) || (a==r.a&&b==r.b&&c<r.c);
            return (a==r.a&&b==r.b) ? c<r.c : (a==r.a?b<r.b:a<r.a);
        }
    }a[N],t[N];
    int c[N];
    inline int lowbit(int x){return x&-x;}
    inline void add(int p,int v){for(;p<=maxVal;p+=lowbit(p)) c[p]+=v;}
    inline int sum(int p){
        int re=0;
        for(;p;p-=lowbit(p)) re+=c[p];
        return re;
    }
    int ans[N];
    void CDQ(int l,int r){
        if(l==r) return;
        int mid=(l+r)>>1;
        CDQ(l,mid);CDQ(mid+1,r);
        int i=l,j=mid+1,p=l;
        while(i<=mid||j<=r){
            if(j>r||(i<=mid&&a[i].b<=a[j].b)) add(a[i].c,a[i].w),t[p++]=a[i++];
            else a[j].f+=sum(a[j].c),t[p++]=a[j++];
        }
        for(int i=l;i<=mid;i++) add(a[i].c,-a[i].w);
        for(int i=l;i<=r;i++) a[i]=t[i];
    }
    int main(){
        freopen("in","r",stdin);
        n=read();maxVal=read();
        for(int i=1;i<=n;i++) 
            a[i].a=read(),a[i].b=read(),a[i].c=read(),a[i].w=1;
        sort(a+1,a+1+n);
        
        int p=1;
        for(int i=2;i<=n;i++){
            if(a[i].a==a[p].a&&a[i].b==a[p].b&&a[i].c==a[p].c) a[p].w++;
            else a[++p]=a[i];
        }
        int nnnnn=n;
        n=p;
        
        CDQ(1,n);
        for(int i=1;i<=n;i++) ans[a[i].f+a[i].w-1]+=a[i].w;
        for(int i=0;i<=nnnnn-1;i++) printf("%d
    ",ans[i]);
    }

     
     
     
  • 相关阅读:
    PHP 大小写转换、首字母大写、每个单词首字母大写转换相关函数
    【论文学习4】BiSample: Bidirectional Sampling for Handling Missing Data with Local Differential Privacy
    【论文学习3】Local Differential Privacy for Deep Learning
    【论文学习2】 Differential Privacy Reinforcement Learning
    深度学习中的优化算法
    Spatial crowdsourcing
    “pip install tensorflow ”出现错误
    python或pip'不是内部或外部命令”
    pip install torch出现错误
    打不开gitHub的解决方法
  • 原文地址:https://www.cnblogs.com/candy99/p/6440361.html
Copyright © 2011-2022 走看看