• 牛客网暑期ACM多校训练营(第二场)J


    题解:CDQ维护即可 复杂度nlogn

    #include <bits/stdc++.h>
    const int MAXN=2e6+10;
    #define ll long long
    using namespace std;
    typedef struct node{
        int x,y,vul;int flag;
        friend bool operator<(node aa,node bb){
        if(aa.x==bb.x&&aa.y==bb.y)return aa.flag>bb.flag;
        else if(aa.x==bb.x) return aa.y>bb.y;
        return aa.x>bb.x;
        }
    }node;
    node d[MAXN*5],d1[MAXN*5];
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
        while(isdigit(ch))x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    int n,m,q,sz;
    int ans[MAXN];int p,num[MAXN];
    int cnt1=0;
    void cdq(int l,int mid,int r){
        int i=l;int j=mid+1;cnt1=0;p=0;
        while(i<=mid&&j<=r){
        while(i<=mid&&d[i].y>=d[j].y){
            d1[++cnt1]=d[i];
            if(d[i].flag==2){p--;num[d[i].vul]--;}
            if(d[i].flag==1){p++;num[d[i].vul]++;}
            i++;
        }
        if(!d[j].flag)ans[(d[j].x-1)*m+d[j].y]+=p-num[d[j].vul];
        d1[++cnt1]=d[j];j++;
        }
        if(i<=mid){
        for(;i<=mid;i++)d1[++cnt1]=d[i];
        }
        if(j<=r){
        for(;j<=r;j++){
            if(!d[j].flag)ans[(d[j].x-1)*m+d[j].y]+=p-num[d[j].vul];
            d1[++cnt1]=d[j];
             }
        }
        for(int i=1;i<=cnt1;i++)d[l+i-1]=d1[i],num[d1[i].vul]=0;
    }
    void guibin(int l,int r){
        if(l>=r)return ;
        int mid=(l+r)>>1;
        guibin(l,mid);
        guibin(mid+1,r);
        cdq(l,mid,r);
    }
    int main(){
        n=read();m=read();q=read();
        int cnt=0;sz=(n)*(m);
        for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            d[++cnt].x=i;d[cnt].y=j;d[cnt].vul=read();d[cnt].flag=0;
        }
        }
        int x1,y1,x2,y2,vul;
        for(int i=1;i<=q;i++){
        x1=read();y1=read();x2=read();y2=read();vul=read();
        d[++cnt].x=x2;d[cnt].y=y2;d[cnt].vul=vul;d[cnt].flag=1;
        d[++cnt].x=x1-1;d[cnt].y=y2;d[cnt].vul=vul;d[cnt].flag=2;
        d[++cnt].x=x2;d[cnt].y=y1-1;d[cnt].vul=vul;d[cnt].flag=2;
        d[++cnt].x=x1-1;d[cnt].y=y1-1;d[cnt].vul=vul;d[cnt].flag=1;
        }
        sort(d+1,d+cnt+1);
    //    cout<<"====="<<endl;
    //    for(int i=1;i<=cnt;i++)cout<<d[i].x<<" "<<d[i].y<<" "<<d[i].flag<<endl;
    //    cout<<"====="<<endl;
        guibin(1,cnt);
    //    for(int i=1;i<=sz;i++)cout<<ans[i]<<" ";
    //    cout<<endl;
        int ans1=0;
        for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(ans[(i-1)*m+j]>=1)ans1++;
            }
        }
        printf("%d
    ",ans1);
        return 0;
    }
    
  • 相关阅读:
    whereis which type find
    souce and bash 的区别
    systemctl daemon-reload
    linux /etc/profile bashrc bash_profile
    ulimt 和 sysctl
    MySQL 问题总结
    asyncio
    Linux 中 MySQL 操作
    总结一波 Redis 面试题
    os 模块 和 re 模块
  • 原文地址:https://www.cnblogs.com/wang9897/p/9348901.html
Copyright © 2020-2023  润新知