【解题报告】 CF67C Cinema
题目:https://www.acwing.com/problem/content/105/
解题思路:
排序+离散化
m部电影和n个人涉及2×m+n种语言。建立一个数组排序再离散化一下,用1到2×m+1之间的数来算。然后就暴力统计一下,就可以得出答案
AC代码
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
const int maxn=5*10e5;
int n,m;
int a[maxn];
int p[maxn];
int w[maxn];
int s[maxn];
int q[maxn];
int k[maxn];
int ans1,ans2;
int ans=1;
void disc(int x)//离散化
{
int c;
sort(p+1,p+x+1);
for(int i=1;i<=x;i++)
{
if(i==1||p[i]!=p[i-1])
q[++c]=p[i];
}
q[0]=c;
}
int query(int x)//离散化的二分查询
{
int l=1,r=q[0],mid;
while(l<r)
{
mid=(l+r)>>1;
if(q[mid]>=x)
r=mid;
else
l=mid+1;
}
return l;
}
int main()
{
int c=0;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
p[++c]=a[i];
}
cin>>m;
for(int i=1;i<=m;i++)
{
cin>>w[i];
p[++c]=w[i];
}
for(int i=1;i<=m;i++)
{
cin>>s[i];
p[++c]=s[i];
}
disc(c);
for(int i=1;i<=n;i++)
k[query(a[i])]++;//暴力统计
for(int i=1;i<=m;i++)
{
int x=k[query(w[i])];
int y=k[query(s[i])];
if(x>ans1||(x==ans1&&y>ans2))
{
ans=i;
ans1=x;
ans2=y;
}
}
cout<<ans<<endl;
return 0;
}