P1823 concert waiting, P1823 concert waiting
Description
N people are queuing for a concert. People were bored, so they began to turn around and wanted to find their acquaintances in the team. Any two people in the queue, A and B, can see each other if they are adjacent or no one is higher than A or B.
Write a program to calculate how many people can see each other.
Input/Output Format
Input Format:
The first line contains an integer N (1 ≤ N ≤ 500 000), indicating that there are N people in the team.
In the next N rows, each line contains an integer indicating the height of a person. In the unit of 10-9 power meters, each person schedules less than 2 ^ 31 m. These heights indicate the heights of the people in the team.
Output Format:
The output contains only one row, containing a number of S, indicating that the total number of S in the team can be seen by people.
Input and Output sample
Input example #1:
7 2 4 1 2 2 5 1
Output sample #1:
10
Description
Data production: @ w
This question was first introduced by myself. If there is something bigger than him later, it would be useless,
Then I made 25 points in a mess...
After reading the problem, I found a very good idea.
Is to put the equal and greater values in a loop to judge,
At the beginning, num = 1 ensures that data is read.
1 # include <iostream> 2 # include <cstdio> 3 # include <cstring> 4 # include <cmath> 5 # include <stack> 6 using namespace std; 7 int read (int & n) 8 {9 char c = '-'; int x = 0; 10 while (c <'0' | c> '9 ') c = getchar (); 11 while (c> = '0' & c <= '9') 12 {13 x = x * 10 + (c-48 ); 14 c = getchar (); 15} 16 n = x; 17} 18 const int MAXN = 500001; 19 stack <int> s; 20 int main () 21 {22 int n, h, ans = 0, flag = 0; 23 read (n); 24 for (int I = 1; I <= n; I ++) 25 {26 flag = 0; 27 read (h); 28 if (I = 1) 29 {30 s. push (h); 31 continue; 32} 33 if (h> s. top () 34 {35 ans ++; 36 s. pop (); 37 while (s. size ()> 0 & h> s. top () 38 {39 ans ++; 40 s. pop (); 41 flag = 1; 42} 43 if (s. size ()! = 0 & h <s. top () 44 ans ++; 45 s. push (h); 46} 47 else if (h = s. top () 48 {49 ans = ans + s. size (); 50 s. push (h); 51} 52 else53 {54 ans ++; 55 s. push (h); 56} 57} 58 printf ("% d", ans); 59}Messing around for 25 minutes
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cmath> 5 #include<stack> 6 using namespace std; 7 int read(int & n) 8 { 9 char c='-';int x=0;10 while(c<'0'||c>'9')c=getchar();11 while(c>='0'&&c<='9')12 {13 x=x*10+(c-48);14 c=getchar();15 }16 n=x;17 }18 const int MAXN=500001;19 stack<int>s;20 int main()21 {22 int n,h,ans=0,flag=0;23 read(n);24 for(int i=1;i<=n;i++)25 {26 int num=1;27 read(h);28 while(s.size()!=0&&h>=s.top())29 {30 31 if(h==s.top())32 num++;33 ans++;34 s.pop();35 } 36 if(s.size()!=0)37 ans++;38 while(num--)39 s.push(h);40 }41 printf("%d",ans);42 }