zoukankan      html  css  js  c++  java
  • AcWing

    题目链接
      没什么好说的,就照着题意做就行了,不过要最后输出的编号是电影在c或者d数组里的下标而不是值。之前用unordered_map跑了1500ms,这个跑了350ms,常数真是个可怕的东西

    const int maxn = 2e5+10;
    int a[maxn], b[maxn], c[maxn], d[maxn], cnt[maxn];
    int bnsh(int l, int r, int x) {
        while(l<=r) {
            int mid = (l+r)>>1;
            if (b[mid]==x) return mid;
            if (b[mid]<x) l = mid+1;
            else r =  mid-1;
        }
        return -1; 
        //我们二分查找在a数组是否存在这个数
        //如果不存在就是-1存在就是它的下标,这样来进行离散化
    }
    int main(void) {
        int n, m;
        scanf("%d", &n);
        for (int i = 0; i<n; ++i) scanf("%d", &a[i]);
        scanf("%d", &m);
        for (int i = 0; i<m; ++i) scanf("%d", &c[i]);
        for (int i = 0; i<m; ++i) scanf("%d", &d[i]);
        sort(a, a+n);
        for (int i = 0; i<n; ++i) b[i] = a[i];
        int len = unique(b, b+n)-b-1; //去重
        for (int i = 0; i<n; ++i) {
            int tmp = bnsh(0, len, a[i]); //对数组a离散化并统计数量
            if (~tmp) ++cnt[tmp];
        }
        for (int i = 0; i<m; ++i) {
            //对数组b和c离散化,之所以不和上面放一起是因为n和m大小不同
            c[i] = bnsh(0, len, c[i]);
            d[i] = bnsh(0, len, d[i]);
        }
        int maxx = 0, maxx2 = 0, ans = 1;
        for (int i = 0; i<m; ++i) {
            if (c[i]!=-1 && maxx<cnt[c[i]]) {
                ans = i+1;
                maxx = cnt[c[i]];
                maxx2 = cnt[d[i]];
            }
            else if (c[i]!=-1 && d[i]!=-1 && maxx==cnt[c[i]] && maxx2<cnt[d[i]]) {
                ans = i+1;
                maxx2 = cnt[d[i]];
            }
        }
        printf("%d
    ", ans);
        return 0;
    }
    
  • 相关阅读:
    设计模式
    设计模式
    设计模式
    设计模式
    【Sublime】许可证 及 相关设置
    【Linux】跳过ubuntu grub2引导,使用Windows引导ubuntu
    【Linux】Windows 7下硬盘安装Ubuntu 14.10图文教程
    【ACM】连连看 hdu1175
    【算法】约瑟夫环 C++源代码
    【Java】配置JAVA的环境变量
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/12560249.html
Copyright © 2011-2022 走看看