여름 훈련 광 솔 시리즈-Hdu 3506 대형 Rectangle in a Histogram(단조 로 운 스 택)

5903 단어 HDU
제목 연결:
   http://acm.hdu.edu.cn/showproblem.php?pid=1506
제목 의 대의:
Ai 를 최소 값 으로 하 는 구간 에 몇 개의 원소 가 있 느 냐 고 수열 An 을 제시 합 니 다.
문제 풀이 방향:
스 택 을 수 동 으로 모 의 합 니 다.스 택 내 요 소 는 단조 로 운 체감 시퀀스 입 니 다.새 원소 Ai 가 창고 에 들 어가 야 할 때 창고 꼭대기 원소 가 Ai 보다 크 면 창고 꼭대기 원소 가 Ai 보다 크 지 않 고 Ai 가 창고 에 들 어 갈 때 까지 팝 업 합 니 다.
여기 서 i 는 스 택 꼭대기 요소 의 사각형 이 뒤로 뻗 어 있 는 경계 이 고 팝 업 과정 에서 Ai 의 행렬 이 앞으로 뻗 어 있 는 경 계 를 기록 할 수 있 습 니 다.
 1 //#include <bits/stdc++.h>
 2 #include <iostream>
 3 #include <algorithm>
 4 #include <cstdio>
 5 using namespace std;
 6 const int maxn = 100005;
 7 #define LL long long//  LL,      ,int   
 8 struct node
 9 {
10     LL x, index;
11 } Stack[maxn];
12 
13 int main ()
14 {
15     LL n;
16     while (scanf ("%I64d", &n), n)
17     {
18         LL sum = 0;
19         LL head, last, num, m;
20         head = 0;
21         last = -1;
22         for (LL i=0; i<=n; i++)
23         {
24             if (i == n)//        0,         
25                 num = 0;
26             else
27                 scanf ("%I64d", &num);
28             m = i;//             
29             while (head<=last && Stack[last].x>num)
30             {
31                 sum = max(sum, (i - Stack[last].index)*Stack[last].x);
32                 m = Stack[last].index;
33                 last --;
34             }
35             Stack[++last].index = m;
36             Stack[last].x = num;
37         }
38         printf ("%I64d
", sum); 39 } 40 return 0; 41 }

좋은 웹페이지 즐겨찾기