Maximizing Advertising (離散化)
阿新 • • 發佈:2018-12-11
在做題的時候,如果要開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;
}