gym-101343H-Give Me This Pizza
Posted Kearon
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gym-101343H-Give Me This Pizza相关的知识,希望对你有一定的参考价值。
1 /* 2 对于数组的每个元素,找到它右边的第一个比它大的元素 3 根据数组元素内容建立索引,有序记录a的每个值的所有出现的位置,然后对于每个a, 4 遍历所有大于a的可能的值,每个值用二分搜索找到当前位置右边的最小的出现位置, 5 (直接遍历会超时) 6 然后这些位置中取最小值即为结果所在的位置。 7 */ 8 #include <bits/stdc++.h> 9 using namespace std; 10 const int inf=0x3f3f3f3f; 11 int n; 12 int a[100005]; 13 int f[55][100005]; 14 int len[55]; 15 int main() 16 { 17 cin>>n; 18 memset(len,0,sizeof(len)); 19 for(int i=1;i<=n;i++) 20 { 21 cin>>a[i]; 22 f[a[i]][len[a[i]]]=i; 23 len[a[i]]++; 24 } 25 for(int i=1;i<=n;i++) 26 { 27 int num=a[i]; 28 int wz=inf; 29 for(int j=num+1;j<=50;j++) 30 { 31 // for(int l=0;k<len[j];l++) 32 // { 33 // if(f[j][l]>i&&f[j][l]<wz) 34 // wz=f[j][l]; 35 // } 36 int l=0,r=len[j]-1; 37 while(l<r) 38 { 39 int mid=(l+r)/2; 40 if(f[j][mid]>i) 41 r=mid; 42 else 43 l=mid+1; 44 } 45 if(f[j][r]>i) 46 if(wz>f[j][r]) 47 wz=f[j][r]; 48 } 49 if(wz==inf) 50 cout<<-1<<‘ ‘; 51 else 52 cout<<a[wz]<<‘ ‘; 53 } 54 cout<<endl; 55 }
以上是关于gym-101343H-Give Me This Pizza的主要内容,如果未能解决你的问题,请参考以下文章
gym-101343E-Abdalrahman Ali Bugs
gym-101343I-Husam and the Broken Present 1
gym-101343B-So You Think You Can Count?