rt,看了讨论区的思路跟我的思路是一样的,但是赛时调了很久都始终不知道错在哪里。最开始我是字典序搞错了28pts,但是改过来之后反而只有11pts,球球帮忙看看qwq
#include<bits/stdc++.h>
using namespace std;
long long n;
string a[1000010];
long long loc[1000010];
map<string,bool> vis;
bool check(string s1,string s2) {
long long len1 = s1.length();
long long len2 = s2.length();
for(long long i = 0;i < min(s1.length(),s2.length());i++)
if(s1[i] > s2[i]) return true;
else if(s1[i] < s2[i]) return false;
if(len1 < len2) return false;
else return true;
}
signed main() {
cin >> n;
for(long long i = 1;i <= n;i++) {
cin >> a[i];
long long t = 0;
for(long long j = 0;j < a[i].length();j++)
t = t * 10 + a[i][j] - '0';
loc[t] = i;
}
long long i = 1;
for(long long j = 0;j < n;j++) {
if(!vis[to_string(i)]) {
vis[to_string(i)] = true;
cout << to_string(i) << " ";
if((check(a[loc[i]-1],a[loc[i]+1]) && !vis[a[loc[i]-1]]) || (!check(a[loc[i]-1],a[loc[i]+1]) && vis[a[loc[i]+1]])) {
long long t = loc[i]-1;
while(t > 0 && !vis[a[t]] && check(a[t],a[t+1])) {
vis[a[t]] = true;
cout << a[t] << " ";
t--;
}
}
else if((!check(a[loc[i]-1],a[loc[i]+1]) && !vis[a[loc[i]+1]]) || (check(a[loc[i]-1],a[loc[i]+1]) && vis[a[loc[i]-1]])){
long long t = loc[i]+1;
while(t <= n && !vis[a[t]] && check(a[t],a[t-1])) {
vis[a[t]] = true;
cout << a[t] << " ";
t++;
}
}
}
if(i * 10 <= n) i *= 10;
else {
while(i % 10 == 9 || i + 1 > n) i /= 10;
i++;
}
}
return 0;
}