牛客寒假算法基础集训营1 G 小a的排列
题目描述
链接: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 }