题意
题解
都是用离散化的吗?这么神奇?
我的思路就是对于(a)排序,对于语音和字幕的也分别排序,然后三个指针一起从小到大跳得到每个电影的语音和字幕能让多少个人高兴起来。
时间复杂度:(O(nlogn+mlogm))
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 210000
using namespace std;
int a[N],n,m;
struct node
{
int x,id;
}b[N]/*语音*/,c[N]/*字幕*/;
struct answer
{
int x,y;
}d[N];
inline bool cmp(int x,int y){return x<y;}
inline bool cmp1(node x,node y){return x.x<y.x;}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&b[i].x);
b[i].id=i;
}
for(int i=1;i<=m;i++)
{
scanf("%d",&c[i].x);
c[i].id=i;
}
sort(a+1,a+n+1,cmp);
sort(b+1,b+m+1,cmp1);
sort(c+1,c+m+1,cmp1);
int now=0/*表示目前是哪种编号的人*/,cnt=0,l1=1,l2=1;
for(int i=1;i<=n;i++)
{
if(a[i]!=now)
{
while(b[l1].x<now && l1<=m)d[b[l1++].id].x=0;
while(b[l1].x==now && l1<=m)d[b[l1++].id].x=cnt;
while(c[l2].x<now && l2<=m)d[c[l2++].id].y=0;
while(c[l2].x==now && l2<=m)d[c[l2++].id].y=cnt;
now=a[i],cnt=1;
}
else cnt++;
}
while(b[l1].x<now && l1<=m)d[b[l1++].id].x=0;
while(b[l1].x==now && l1<=m)d[b[l1++].id].x=cnt;
while(c[l2].x<now && l2<=m)d[c[l2++].id].y=0;
while(c[l2].x==now && l2<=m)d[c[l2++].id].y=cnt;
answer ans;int id=0;ans.x=ans.y=0;
for(int i=1;i<=m;i++)
{
if(d[i].x>ans.x || (d[i].x==ans.x && d[i].y>=ans.y))id=i,ans=d[i];
}
printf("%d
",id);
return 0;
}