【洛谷P1978】 集合

集合

题目链接

显然,我们是要把数据先排序的,

然后从大到小枚举每个数,看是否能选上,

能选就选,不能拉倒

若能,二分查找a[i]/k,若查找成功,ans++

将a[i]/k标记为不能选择

最后输出答案即可

(从小到大枚举会爆long long)

 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 using namespace std;
 6 #define N 100010
 7 #define int long long
 8 int n,k,a[N],ans,Maxx;
 9 bool not_ok[N];
10 #undef int
11 int main()
12 #define int long long
13 {
14     scanf("%lld%lld",&n,&k);
15     for(int i=1;i<=n;i++)
16      scanf("%lld",&a[i]);
17     sort(a+1,a+1+n);
18     for(int i=n;i>=1;i--)
19      if(!not_ok[i]){
20          ans++;
21          if(a[i]%k!=0) continue;
22          int l=1,r=i-1;
23          while(l<r){
24              int mid=(l+r)>>1;
25              if(a[mid]>=a[i]/k) r=mid;
26              else l=mid+1;
27         }
28         if(a[l]==a[i]/k) not_ok[l]=1;
29      }
30     printf("%lld\n",ans);
31     return 0;
32 }

 

posted @ 2018-07-24 17:54  yjk  阅读(169)  评论(0编辑  收藏  举报