1. 程式人生 > >牛客寒假算法基礎集訓營1 G 小a的排列

牛客寒假算法基礎集訓營1 G 小a的排列

ace -- 要求 鏈接 bits https href return 我們

題目描述

鏈接:https://ac.nowcoder.com/acm/contest/317/G
來源:牛客網

思路:觀察發現區間內l-r的長度與區間內最大值和最小值的差相等時,區間是‘萌’的

如果長度不相等的話,我們就要尋找l--,r++的數,並且在區間內的數加入要求的區間內;

代碼如下:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 
 5 int main()
 6 {
 7     int n,x,y,l,r;
 8     int a[100005];
 9     while(cin >> n >> x >> y)
10 { 11 for(int i = 1;i <= n;i++) 12 { 13 cin >> a[i]; 14 if(a[i] == x) 15 l = i; 16 if(a[i] == y) 17 r = i; 18 } 19 if(l > r) 20 swap(l,r); 21 bool flag; 22 int min1 = 0x3f3f3f
,max1 = 0,l1,r1; 23 for(int i = l;i <= r;i++) 24 { 25 min1 = min(min1,a[i]); 26 max1 = max(max1,a[i]); 27 } 28 while(max1 - min1 != r - l) 29 { 30 l1 = 1,r1 = n; 31 while(l1 < l &&(a[l1] < min1 || a[l1] > max1))
32 l1++;//尋找最左邊的l 33 //cout << l1 << "---"; 34 while(r1 > r &&(a[r1] < min1 || a[r1] > max1)) 35 r1--; 36 //cout << r1 << "--" << endl; 37 l = l1,r = r1; 38 for(int i = l;i <= r;i++) 39 { 40 min1 = min(min1,a[i]); 41 max1 = max(max1,a[i]); 42 } 43 } 44 cout << l << " " << r << endl; 45 } 46 return 0; 47 }

牛客寒假算法基礎集訓營1 G 小a的排列