暴力(12分)
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
int a[100010];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
set<int> st;
for(int i=0;i<n;i++){
if(i==0 || i==n-1){
st.insert(a[i]);
continue;
}
//左邊最大和右邊最小
int maxleft=*max_element(a,a+i);
int minright=*min_element(a+i+1,a+n);
if(maxleft < a[i] && a[i] < minright){
st.insert(a[i]);
}
}
cout << st.size() << '\n';
set<int>::iterator it;
for(it=st.begin();it!=st.end();){
cout << *it;
if(++it!=st.end()){
cout << " ";
}
}
return 0;
}
靈光一動,這不字首和思想嗎?
dp記錄每個元素左邊最大和右邊最小。然後遍歷判斷一遍,時間O(n)就哦可了。
字首和(25分)
#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
#define ll long long
ll a[100010];
ll lMax[100010],rMin[100010];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
lMax[0]=a[0];
for(int i=1;i<n;i++){
lMax[i]=max(a[i-1],lMax[i-1]);
}
rMin[n-1]=a[n-1];
for(int i=n-2;i>=0;i--){
rMin[i]=min(a[i+1],rMin[i+1]);
}
set<ll> st;
for(int i=0;i<n;i++){
if(i==0){
if(a[i]<rMin[i]){
st.insert(a[i]);
}
}else if(i==n-1){
if(a[i]>lMax[i]){
st.insert(a[i]);
}
}else{
if(a[i]>lMax[i] && a[i]<rMin[i]){
st.insert(a[i]);
}
}
}
cout << st.size() << '\n';
if(st.size()==0) cout << '\n';
set<ll>::iterator it;
for(it=st.begin();it!=st.end();){
cout << *it;
if(++it!=st.end()){
cout << " ";
}
}
return 0;
}