题意:
输入两个正整数N和P(N<=1e5,P<=1e9),接着输入N个正整数。输出一组数的最大个数使得其中最大的数不超过最小的数P倍。
trick:
测试点5会爆int,因为P太大了。。。
AAAAAccepted code:
1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 typedef struct node{ 5 long long val; 6 bool flag; 7 }; 8 bool cmp(node a,node b){ 9 if(a.val!=b.val) 10 return a.val<b.val; 11 return a.flag>b.flag; 12 } 13 node a[200007]; 14 map<int,int>pos; 15 int main(){ 16 ios::sync_with_stdio(false); 17 cin.tie(NULL); 18 cout.tie(NULL); 19 int n,p; 20 cin>>n>>p; 21 for(int i=1;i<=n;++i) 22 cin>>a[i].val; 23 for(int i=1;i<=n;++i){ 24 a[i+n].val=a[i].val*p+1; 25 a[i+n].flag=1; 26 } 27 sort(a+1,a+1+n+n,cmp); 28 int cnt=0; 29 int ans=0; 30 for(int i=1;i<=n+n;++i){ 31 if(a[i].flag==0){ 32 ++cnt; 33 if(!pos[a[i].val]) 34 pos[a[i].val]=cnt; 35 } 36 else{ 37 int x=(a[i].val-1)/p; 38 int tamp=cnt-pos[x]+1; 39 ans=max(ans,tamp); 40 } 41 } 42 cout<<ans; 43 return 0; 44 }