1008 - 离散化 - CF670C

传送门

 

分析

m 部电影和 n 个人最多涉及 2*m + n 种语言,我们把所有的电影和人涉及的语言放进一个数组,排序并离散化, 用一个 1~2*m+n 之间的整数代替每种语言。此时我们就可以用数组直接统计会上述每种语言的人的数量,从而选择满足题目要求的电影。

(摘自算法竞赛)

 

代码

#include<bits/stdc++.h>
#define N 200009
#define in read()
using namespace std;
inline int read(){
	char ch;int f=1,res=0;
	while((ch=getchar())<'0'||ch>'9') if(ch=='-') f=-1;
	while(ch>='0'&&ch<='9'){
		res=(res<<3)+(res<<1)+ch-'0';
		ch=getchar();
	}
	return f==1?res:-res;
}
int a[N],b[N],c[N],aa[4*N];
struct node{
	int top,sec;
}p[N];
int sum[4*N],cnt=0,n,m;
int main(){
	n=in;for(int i=1;i<=n;++i) a[i]=aa[++cnt]=in;
	m=in;for(int i=1;i<=m;++i) b[i]=aa[++cnt]=in;
	for(int i=1;i<=m;++i) c[i]=aa[++cnt]=in;
	sort(aa+1,aa+cnt+1);
	int nn=n;
	nn=unique(aa+1,aa+cnt+1)-aa-1;
	for(int i=1;i<=n;++i){
		int pos=lower_bound(aa+1,aa+nn+1,a[i])-aa;
		++sum[pos];
	}
	int ans,maxn=-1,maxn2=-1;
	for(int i=1;i<=m;++i){
		int pos=lower_bound(aa+1,aa+nn+1,b[i])-aa;
		int pp=lower_bound(aa+1,aa+nn+1,c[i])-aa;
		if(sum[pos]>maxn){
			maxn=sum[pos];maxn2=sum[pp];//更新 
			ans=i;
		}
		else if(sum[pos]==maxn){
			if(sum[pp]>maxn2){
				maxn2=sum[pp];
				ans=i;
			}
		}
	}
	printf("%d",ans);
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值