Maximizing Advertising (离散化)

在做题的时候,如果要开vis数组但是下标比较大的时候,需要用离散化做

 sort(tmp+1,tmp+1+n);
    int num=unique(tmp+1,tmp+n+1)-tmp-1;
    for(int i=1;i<=n;i++){
        x[i]=lower_bound(tmp+1,tmp+1+num,x[i])-tmp;
        	//离散化后的数的范围为1~num
    }

例题: Maximizing Advertising

题意: 在空间中取两个矩阵,一个矩阵可以得到黑点,另一个白点,求两个矩阵得到的点的数量的最大值

解析: 相当于一条线(平行于x轴或者平行于y轴)将空间分成两部分,再利用黑点和白点的前缀和,维护一下ans

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000005;
int x[maxn],y[maxn],tmp[maxn],bla[maxn],whi[maxn],tmp1[maxn];
bool flag[maxn];
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        char s[5];
        scanf("%d%d%s",&x[i],&y[i],s);
        if(s[0]=='b') flag[i]=1;
        tmp[i]=x[i];
        tmp1[i]=y[i];
    }
    
    
    
    sort(tmp+1,tmp+1+n);
    int num=unique(tmp+1,tmp+n+1)-tmp-1;
    for(int i=1;i<=n;i++){
        x[i]=lower_bound(tmp+1,tmp+1+num,x[i])-tmp;
        if(flag[i]) bla[x[i]]++;
        else whi[x[i]]++;
    }
    for(int i=1;i<=num;i++){
        bla[i]+=bla[i-1];
        whi[i]+=whi[i-1];
    }
    int ans=0;
    for(int i=1;i<=num;i++){
        ans=max(ans,max(bla[i]+whi[num]-whi[i],whi[i]+bla[num]-bla[i]));
    }
    
    
    
    memset(bla,0,sizeof(bla));
    memset(whi,0,sizeof(whi));
    
    
    
    sort(tmp1+1,tmp1+1+n);
    num=unique(tmp1+1,tmp1+n+1)-tmp1-1;
    for(int i=1;i<=n;i++){
        y[i]=lower_bound(tmp1+1,tmp1+1+num,y[i])-tmp1;
        if(flag[i]) bla[y[i]]++;
        else whi[y[i]]++;
    }
    for(int i=1;i<=num;i++){
        bla[i]+=bla[i-1];
        whi[i]+=whi[i-1];
    }
    for(int i=1;i<=num;i++){
        ans=max(ans,max(bla[i]+whi[num]-whi[i],whi[i]+bla[num]-bla[i]));
    }
    printf("%d\n",ans);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/82823065