由硬算超时,到找到规律的我哈哈哈~~~
#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
using namespace std;
const int inf=1000000000;
set<int>ans,temp;
int main(){
int n;
cin>>n;
vector<int> a(n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
temp.insert(a[i]);
}
int u=0,max=0,min[n],minn=inf;
fill(min,min+n,inf);
for(int i=n-1;i>=0;i--){
if(a[i]<minn){
minn=a[i];
min[i]=minn;
}
}
for(auto it=temp.begin();it!=temp.end();it++){
if(a[u]>max) max=a[u];
if(*it==a[u]&&max<=*it&&min[u]>=*it)
ans.insert(*it);
u++;
}
/* for(int i=0;i<n;i++){
int flag=0;
for(int j=0;j<n;j++){
if(i>=j){
if(a[j]>a[i]) flag=1;
}
else{
if(a[j]<a[i]) flag=1;
}
}
if(flag==0){
ans.insert(a[i]);
}
}*/
printf("%d\n",ans.size());
for(auto it=ans.begin();it!=ans.end();it++){
if(it!=ans.begin())printf(" ");
printf("%d",*it);
}
printf("\n");
return 0;
}
总结
1.本题如果直接进行双重for循环会直接超时4个点,见我注释掉的部分,后来改进方法,如果是符合条件的,左小右大,则顺序也和set中的一样,当然这只是入门条件,还需要找出他左边的最大值,右边的最小值,当于当下元素比较,没有嵌套的for循环,由乘法变成加法,结果还有一个点格式错误,最后再加一个换行就好啦~~~
2.unorderer_set,就是省略了排序的set那还有个鸟用,map省略排序还行,毕竟map的排序确实一般用不到(没用过实话),所以如果用set,只能用set
3.格式不对时最后加个换行试试
4.事先建立最大最小值列表减少for循环嵌套好好总结一下注意边界条件
英语
无
二刷记录
二刷的代码几乎完全等效 但却是这样最后发现const maxn 写的10^8
题目N distinct positive integers no larger than 10^9
就因为一个0 一片绿 所以以后最大值是多少就要写多少不要有侥幸心理
加0后
//除了在最终位置上还有保证左小右大
#include<bits/stdc++.h>
using namespace std;
vector<long long > init,ccopy;
set<long long> ans;
//const int inf=100000000;//10^9最大值少一个0都不行
const int inf=1000000000;
int main(){
int n;
long long _1;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%lld",&_1);
init.push_back(_1);
}
ccopy=init;
int bookmin[n],bookmax[n],mx=0,mn=inf;
fill(bookmin,bookmin+n,inf);
//fill(bookmax,bookmax+n,0);
for(int i=n-1;i>=0;i--){
if(ccopy[i]<mn){
mn=ccopy[i];
bookmin[i]=mn;
}
}
sort(init.begin(),init.end());
for(int i=0;i<n;i++){
if(ccopy[i]>mx) mx=ccopy[i];
if(init[i]==ccopy[i]&&ccopy[i]>=mx&&ccopy[i]<=bookmin[i]){//不是init init已经排过序了应该是原序列的情况
ans.insert(ccopy[i]);
}
}
printf("%d\n",ans.size());
for(auto it=ans.begin();it!=ans.end();it++){
if(it!=ans.begin()) printf(" ");
printf("%lld",*it);
}
printf("\n");
return 0;
}