E.XKC's basketball team
ps:
比赛过程中读错题了,而且一直没发现(好难受)。以为要求满足要求的个数,一直没有思路,没想到是求最长距离,那就很容易了。
solution:
贪心的从后往前维护一个单调递增序列,因为对于i<j,a[i]<=a[j],对于i之前的数那么a[j]可以完全替代a[i]的作用。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=5e5+5; 4 typedef long long ll; 5 6 inline int read() 7 { 8 char ch=getchar();int x=0,f=0; 9 while(ch<'0' || ch>'9') f|=ch=='-',ch=getchar(); 10 while(ch>='0' && ch<='9') x=x*10+ch-'0',ch=getchar(); 11 return f?-x:x; 12 } 13 14 15 int a[maxn]; 16 int num[maxn]; 17 vector <int > V; 18 int main(){ 19 int n,m;n=read();m=read(); 20 for(int i=1;i<=n;i++) a[i]=read(); 21 V.push_back(n);num[n]=-1; 22 for(int i=n-1;i>=1;i--){ 23 int tmp=a[i]+m; 24 int l=0;int r=V.size()-1; 25 int ans=-1; 26 while(l<=r){ 27 int mid=(l+r)/2; 28 if(a[V[mid]]>=tmp) 29 { 30 ans=max(ans,V[mid]); 31 r=mid-1; 32 } 33 else{ 34 l=mid+1; 35 } 36 } 37 if(ans==-1) num[i]=ans; 38 else num[i]=ans-i-1; 39 if(a[i]>a[V[V.size()-1]]) V.push_back(i); 40 41 } 42 for(int i=1;i<=n;i++){ 43 if(i==1) cout <<num[i]; 44 else cout <<" "<<num[i]; 45 } 46 return 0; 47 }
K.Center
solution:
暴力枚举每两个点的中点,然后找到出现次数最多的中点,ans=n-tans,因为tans是n^2枚举的,所以不用*2.
有一个疑问,为什么加了if(i==j) continue;之后会re。(真的好神奇)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=5e5+5; 4 typedef long long ll; 5 6 struct node{ 7 int x;int y; 8 }e[10005]; 9 map<pair<int,int>,int>M; 10 int main(){ 11 std::ios::sync_with_stdio(false); 12 int n;cin>>n; 13 for(int i=1;i<=n;i++) cin>>e[i].x>>e[i].y,e[i].x*=2,e[i].y*=2; 14 int tans=0; 15 for(int i=1;i<=n;i++){ 16 for(int j=1;j<=n;j++){18 int tmx=(e[i].x+e[j].x)/2; 19 int tmy=(e[i].y+e[j].y)/2; 20 pair <int,int > P; 21 P=make_pair(tmx,tmy); 22 M[P]++; 23 if(M[P]>tans) tans=M[P];25 26 } 27 } 28 cout <<n-tans<<"\n"; 29 30 31 return 0; 32 }