1. 程式人生 > >Maximizing Advertising (離散化)

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; }