首页 > 代码库 > gym-101343H-Give Me This Pizza

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