【解题报告】 CF67C Cinema

【解题报告】 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;
}
posted @ 2019-08-06 23:58  wweiyi  阅读(173)  评论(0编辑  收藏  举报
js脚本