题目链接: CodeForces 670C‘
题意:有n个科学家去看电影,要使这些科学家能听懂的人数最多,在能听懂的人数一样的情况下,选择能看懂字幕的人数最多的那个电影作为答案
神奇的二分搜索
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cctype>
#include<cmath>
#include<algorithm>
using namespace std;
#define N 200100
#define INF 0x3f3f3f3f
typedef long long LL;
typedef unsigned long long ULL;
int a[N], b[N], c[N];
int Search1(int l, int r, int x)
{
if(l==r) return l;
int mid=(l+r)/2;
if(a[mid]<x)
return Search1(mid+1, r, x);
else
return Search1(l, mid, x);
}
int Search2(int l, int r, int x)
{
if(l==r) return l;
int mid=(l+r)/2;
if(a[mid]<=x)
return Search2(mid+1, r, x);
else
return Search2(l, mid, x);
}
int main()
{
int n, m, ans, s, id;
while(~scanf("%d", &n))
{
for(int i=0; i<n; i++)
scanf("%d", &a[i]);
sort(a, a+n);
scanf("%d", &m);
for(int i=0; i<m; i++)
scanf("%d", &b[i]);
for(int i=0; i<m; i++)
scanf("%d", &c[i]);
ans=-INF, s=-INF, id=-1;
for(int i=0; i<m; i++)
{
int x, y, t, l, r, k;
x=Search1(0, n, b[i]);
y=Search2(0, n, b[i]);
t=y-x;
l=Search1(0, n, c[i]);
r=Search2(0, n, c[i]);
k=r-l;
if(t>ans || (t==ans&&s<k))
{
ans=t;
s=k;
id=i;
}
}
printf("%d
", id+1);
}
return 0;
}