【洛谷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 }