求小数据hack,80分代码,WA了测试点1,2
查看原帖
求小数据hack,80分代码,WA了测试点1,2
1019606
KouMoSir楼主2024/5/2 23:08
#include<unordered_map>
#include<algorithm>
#include<stdlib.h> 
#include<iostream>
#include<iomanip>
#include<utility>
#include<random>
#include<vector>
#include<cmath>
#include<array>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> pa;
const ll N = 1e7 + 10, INF = 0x7fffffffffffffff, MOD = 1e9 + 7;
ll t;
ll n, k, con[N][2], ori[N];
bool cmp(int x, int y) {
    if (ori[x] != ori[y])return ori[x] > ori[y];
    else return x < y;
}
void push_up(int ind) {
    int tmp[4] = { con[ind * 2][0],con[ind * 2][1],con[ind * 2 + 1][0], con[ind * 2 + 1][1] };
    sort(tmp, tmp + 4, cmp);
    ll res = 0;
    con[ind][0] = tmp[0];
    for (int i = 1; i < 4; i++)if (ori[tmp[i]] != ori[tmp[0]])res = tmp[i];
    con[ind][1] = res;
}
void build(int l, int r, int ind) {
    if (l == r) {
        con[ind][0] = l;
        con[ind][1] = 0;
        return;
    }
    ll mid = l + r >> 1;
    build(l, mid, ind * 2);
    build(mid + 1, r, ind * 2 + 1);
    push_up(ind);
}
void udp(int l, int r, int ind, int tmpl, int tmpr, int val) {
    if (l >= tmpl && r <= tmpr) {
        con[ind][0] = val;
        return;
    }
    ll mid = l + r >> 1;
    if (mid >= tmpl)udp(l, mid, ind * 2, tmpl, tmpr, val);
    if (mid + 1 <= tmpr)udp(mid + 1, r, ind * 2 + 1, tmpl, tmpr, val);
    push_up(ind);
}
pa query(int l, int r, int ind, int tmpl, int tmpr) {
    if (l >= tmpl && r <= tmpr) {
        return { con[ind][0], con[ind][1] };
    }
    ll mid = l + r >> 1;
    pa tmp, tmpp;
    if (mid >= tmpl)tmp = query(l, mid, ind * 2, tmpl, tmpr);
    if (mid + 1 <= tmpr)tmpp = query(mid + 1, r, ind * 2 + 1, tmpl, tmpr);

    int res[4] = { tmp.first,tmp.second,tmpp.first, tmpp.second };
    sort(res, res + 4, cmp);
    for (int i = 1; i < 4; i++) {
        if (ori[res[i]] != ori[res[0]]) {
            return { res[0],res[i] };
        }
    }
    return { res[0],0 };
}
ll querym(int l, int r, int ind, int tmpl, int tmpr) {
    if (l >= tmpl && r <= tmpr) {
        return con[ind][0];
    }
    ll mid = l + r >> 1;
    ll tmp = 0, tmpp = 0;
    if (mid >= tmpl)tmp = querym(l, mid, ind * 2, tmpl, tmpr);
    if (mid + 1 <= tmpr)tmpp = querym(mid + 1, r, ind * 2 + 1, tmpl, tmpr);
    if (cmp(tmp, tmpp))return tmp;
    else return tmpp;
}
void solve() {
    ori[0] = -1;
    deque<ll> ans;
    cin >> n >> k;
    for (int i = 1; i <= n; i++)cin >> ori[i];
    build(1, n, 1);
    for (int i = 1; i <= n; i++) {
        // when u located in i ,you can get the max val from i to i+k ,
        // if return is -1, you get -1 ,but no k decline

        ll res = 0;
        res = querym(1, n, 1, i, i + k);
        if (ans.size() && ori[res] == ans.back() && ori[res] != -1)res = query(1, n, 1, i, i + k).second;
        if (res)k -= res - i;
        ans.push_back(ori[res]);
        if (res)udp(1, n, 1, res, res, 0);
    }
    for (ll i : ans)cout << i << " ";
    cout << '\n';
    // 5 3 
    // 1 2 3 4 1 

    // 5 10 
    // 1 2 2 1 1 
    // 2 1 2 1 -1 
}
int main() {
    t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
2024/5/2 23:08
加载中...