zoukankan      html  css  js  c++  java
  • Codeforces.566F.Clique in the Divisibility Graph(DP)

    题目链接

    (Description)

    给定集合(S={a_1,a_2,ldots,a_n}),集合中两点之间有边当且仅当(a_i|a_j)(a_j|a_i)
    (S)最大的一个子集(S'),并满足(S')中任意两点间都有连边((S')中只有1个点也是合法的)。
    (n,a_ileq 10^6)(a_i)互不相同。

    (Solution)

    从小到大选(已经排好序),如果选了(a_i),则下一个数一定是(a_i)的倍数,下下个数一定是下个数和这个数的倍数。。
    容易想到DP,每次更新其倍数即可。

    复杂度。。好像不是(O(nln n))吧?哦,看漏了个(a_i)互不相同。。
    (a_i)可相同就有趣了。
    算了。。怎么着都能被卡到(O(n^2))。。

    #include <cstdio>
    #include <cctype>
    #include <algorithm>
    #define gc() getchar()
    const int N=1e6+5;
    
    int n,A[N],f[N];
    
    inline int read()
    {
    	int now=0;register char c=gc();
    	for(;!isdigit(c);c=gc());
    	for(;isdigit(c);now=now*10+c-'0',c=gc());
    	return now;
    }
    
    int main()
    {
    	n=read(); int mx=0, ans=1;
    	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read());
    	for(int i=1; i<=n; ++i)
    	{
    		int a=A[i], v=++f[a];
    		ans=std::max(ans,v);
    		for(int j=a<<1; j<=mx; j+=a) f[j]=std::max(f[j],v);
    	}
    	printf("%d
    ",ans);
    
    	return 0;
    }
    
  • 相关阅读:
    2019第二周作业
    求最大值及其下标
    查找整数
    2018秋季学习总结
    抓老鼠 亏了还是赚了
    币值转换
    打印沙漏
    从文本中找出url,并附上链接。
    手机端点击输入框页面会放大
    <dl>、<dt>和<dd>标记的用法
  • 原文地址:https://www.cnblogs.com/SovietPower/p/9556560.html
Copyright © 2011-2022 走看看