感觉思路没问题求调
  • 板块P11396 排队
  • 楼主焚魂
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/12/15 10:40
  • 上次更新2024/12/15 14:02:26
查看原帖
感觉思路没问题求调
206423
焚魂楼主2024/12/15 10:40

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;
}
2024/12/15 10:40
加载中...