• 威士忌(whiskey)


    威士忌(whiskey)

    题目描述

     

    Alan 喝了假威士忌,想问你一个问题:

    nvliu66 推荐大家读三本书《百年孤独》、《城市发展史》、《美国大城市的生与死》,三本书的总页数分别为p,q,rp,q,r。现有nn个nvliu66 的粉丝,作为nvliu66的粉丝,想必每本书都至少读过一页,其中第ii个粉丝读过aiai页《百年孤独》、bibi页《城市发展史》、cici页《美国大城市的生与死》(1≤ai≤p,1≤bi≤q,1≤ci≤r)(1≤ai≤p,1≤bi≤q,1≤ci≤r)。如果粉丝xx有不少于两本书阅读过的页数都严格多余粉丝yy,即当ax>ay,bx>by,cx>cyax>ay,bx>by,cx>cy三个条件中有至少两个成立时,那么称xx比yy更“博闻强识”。

    Alan 作为nvliu66 的粉丝,也决定去读a0a0页《百年孤独》、b0b0页《城市发展史》、c0c0页《美国大城市的生与死》(1≤a0≤p,1≤b0≤q,1≤c0≤r)(1≤a0≤p,1≤b0≤q,1≤c0≤r)。如果Alan 比nn个粉丝都要博闻强识,那么他就会感到很奴比。Alan 想知道自己有多少种不同的读书方案使自己会很奴比,两个读书方案不同当且仅当存在一本书读取的页数不同。

     

    输入

     

    第一行,四个整数n,p,q,rn,p,q,r。

    接下来nn行,每行三个整数ai,bi,ciai,bi,ci。


    solution

    考虑枚举一位a

    分情况考虑:

    1.ai>a

    那么我们一定要保证bc都小于a

    这个可以预处理很方便求出max

    2.ai<a

    那么我们要保证b或c至少有一维要更大

    把所有(b,c)抽象成点,那么我们的选择不能在任何一个以bc为右上角的矩形内。

    注意到矩形的并y是递减的

    我们可以用线段树维护这些矩形面积的并。

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #define maxn 500005
    #define ll long long
    using namespace std;
    int n;
    ll P,Q,R,mc[maxn],mb[maxn];
    ll ans;
    struct node{
        ll a,b,c;
    }s[maxn];
    struct no{
        int l,r,len;
        ll v,Max,bj;
    }tree[maxn*4];
    bool cmp(node a,node b){
        return a.a<b.a;
    }
    void wh(int k){
        tree[k].Max=max(tree[k*2].Max,tree[k*2+1].Max);
        tree[k].v=tree[k*2].v+tree[k*2+1].v;
    }
    void build(int k,int l,int r){
        tree[k].l=l;tree[k].r=r;tree[k].len=r-l+1;
        if(l==r){tree[k].v=R;return;}
        int mid=l+r>>1;
        build(k*2,l,mid);build(k*2+1,mid+1,r);
        wh(k);
    }
    void down(int k){
        ll &v=tree[k].bj,up=R-tree[k].bj;
        if(v!=0){
            tree[k*2].Max=tree[k*2+1].Max=v;
            tree[k*2].v=1LL*tree[k*2].len*up;
            tree[k*2+1].v=1LL*tree[k*2+1].len*up;
            tree[k*2].bj=tree[k*2+1].bj=v;
            v=0;
        }
    }
    int find(int k,int pl){
        if(tree[k].l==tree[k].r)return tree[k].l;
        down(k);
        if(tree[k*2+1].Max>=pl)return find(k*2+1,pl);
        else return find(k*2,pl);
    }
    ll ask(int k,ll li,ll ri){
        if(li>ri)return 0;
        if(tree[k].l>=li&&tree[k].r<=ri){
            return tree[k].v;
        }
        down(k);
        int mid=tree[k].l+tree[k].r>>1;
        ll tmp=0;
        if(li<=mid)tmp+=ask(k*2,li,ri);
        if(ri>mid)tmp+=ask(k*2+1,li,ri);
        return tmp;
    }
    void ch(int k,int li,int ri,ll v,ll up){
        if(li>ri)return;
        if(tree[k].l>=li&&tree[k].r<=ri){
            tree[k].Max=v;tree[k].v=1LL*tree[k].len*up;
            tree[k].bj=v;
            return;
        }
        down(k);
        int mid=tree[k].l+tree[k].r>>1;
        if(li<=mid)ch(k*2,li,ri,v,up);
        if(ri>mid)ch(k*2+1,li,ri,v,up);
        wh(k);
    }
    int main()
    {
        cin>>n>>P>>Q>>R;
        for(int i=1;i<=n;i++)scanf("%lld%lld%lld",&s[i].a,&s[i].b,&s[i].c);
        sort(s+1,s+n+1,cmp);
        for(int i=n;i>=1;i--)mb[i]=max(mb[i+1],s[i].b),mc[i]=max(mc[i+1],s[i].c);
        build(1,1,Q);ll la=1;
        for(int i=1;i<=n;i++){
            ll nb=mb[i]+1,nc=mc[i]+1;
            ll pl=find(1,nc);if(tree[1].Max<nc)pl=0;
            ll tmp=0;
            if(!pl){
                tmp=tmp+(Q-nb+1)*(R-nc+1);
            }
            else {
                tmp=ask(1,nb,pl);
                ll t=max(nb,pl+1);
                tmp+=1LL*(Q-t+1)*(R-nc+1);
            }
            tmp=tmp*(s[i].a-la+1);
            ans=ans+tmp;
            la=s[i].a+1;
            ll ap=find(1,s[i].c);
            if(tree[1].Max<s[i].c)ap=0;
            ch(1,ap+1,s[i].b,s[i].c,R-s[i].c);
        }
        ll tmp=ask(1,1,Q);
        tmp=tmp*(P-la+1);
        ans=ans+tmp;
        cout<<ans<<endl;
        return 0;
    }
     
  • 相关阅读:
    人脸识别常用数据集大全(12/20更新)
    103 保序回归 isotonic regression
    SVM的概率输出(Platt scaling)
    scikit_learn 中文说明入门
    外点惩处函数法·约束优化问题
    unigui 设置单元格颜色
    一些仪器的解码程序(delphi)
    phpstudy 配置 memcached / memcache
    OmniThreadLibrary学习笔记
    注意微信支付的配置
  • 原文地址:https://www.cnblogs.com/liankewei/p/10358751.html
Copyright © 2020-2023  润新知