小蓝书:电影

题意

题意

题解

都是用离散化的吗?这么神奇?

我的思路就是对于\(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\n",id);
	return  0;
}

猜你喜欢

转载自www.cnblogs.com/zhangjianjunab/p/13403755.html
今日推荐