在做题的时候,如果要开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
}
题意: 在空间中取两个矩阵,一个矩阵可以得到黑点,另一个白点,求两个矩阵得到的点的数量的最大值
解析: 相当于一条线(平行于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;
}