zoukankan      html  css  js  c++  java
  • 【Henu ACM Round #12 D】 Longest Subsequence

    【链接】 我是链接,点我呀:)
    【题意】

    在这里输入题意

    【题解】

    记录每个数字出现的次数cnt[x]; (大于1e6的直接忽略)

    另外用一个数组z[1e6]

    然后for枚举x
    第二层for枚举x的倍数(倍数不超过m)
    即for (int i = x;i <=m;i+=x)
    z[i]+=cnt[x];
    这样z[i]就表示a[]中I的约数有多少个。
    显然i也是这些约数的倍数。
    我们无法确定i是这些数的最小公倍数。
    但是我们可以找一个最大的z[i]
    使得i最小。
    这样i肯定就是这z[i]个约数的最小公倍数了。
    (最大的z[i]保证了这个序列最长
    且i肯定就是要求的答案。

    然后在数组中看看哪些数字是这个i的约数,输出就可以了。

    (有一个知识点:(∑^m_1 frac{m}{i} ≈O(m*logm))

    【代码】

    #include <bits/stdc++.h>
    using namespace std;
    
    const int N = 1e6;
    
    int n,m,cnt[N+10],z[N+10],a[N+10];
    bool have = false;
    
    int main(){
    	#ifdef LOCAL_DEFINE
    	    freopen("rush_in.txt", "r", stdin);
    	#endif
    	ios::sync_with_stdio(0),cin.tie(0);
        cin >> n >> m;
        for (int i = 1;i <= n;i++){
            int x;
            cin >> x;
            a[i] = x;
            if (x>m) continue;
            have = true;
            cnt[x]++;
        }
    
        if (!have){
            cout <<1<<' '<<0<<endl;
            return 0;
        }
    
        for (int i = 1;i <= m;i++){
            for (int j = i;j<=m;j+=i){
                z[j]+=cnt[i];
            }
        }
    
        int ma = 1,idx=-1;
        for (int i = m;i >= 1;i--)
            if (z[i]>=ma){
                idx = i;
                ma = z[i];
            }
        cout <<idx<<' '<<ma<<endl;
        if (idx==-1) return 0;
        for (int i = 1;i <=n;i++)
            if (idx%a[i]==0) cout <<i<<' ';
        cout << endl;
    	return 0;
    }
    
  • 相关阅读:
    创建类以及引用一个类
    修改hosts文件
    微信第三方登录接口开发
    Android定位
    Leetcode 102. Binary Tree Level Order Traversal
    Leetcode 725. Split Linked List in Parts
    Leetcode 445. Add Two Numbers II
    Leetcode 328. Odd Even Linked List
    Leetcode 237. Delete Node in a Linked List
    Leetcode 234. Palindrome Linked List
  • 原文地址:https://www.cnblogs.com/AWCXV/p/8328738.html
Copyright © 2011-2022 走看看