【解题报告】 CF67C Cinema
解题思路:
排序+离散化
m部电影和n个人涉及2×m+n种语言。建立一个数组排序再离散化一下,用1到2×m+1之间的数来算。然后就暴力统计一下,就可以得出答案
AC代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #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; }
|