QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#343165#1817. AND PermutationLaStataleBlue#WA 2ms4020kbC++233.8kb2024-03-02 00:50:092024-03-02 00:50:10

Judging History

你现在查看的是最新测评结果

  • [2024-03-02 00:50:10]
  • 评测
  • 测评结果:WA
  • 用时:2ms
  • 内存:4020kb
  • [2024-03-02 00:50:09]
  • 提交

answer

#pragma ide diagnostic ignored "misc-no-recursion"

#include "bits/stdc++.h"

using namespace std;
typedef long long ll;
typedef long double db;

#define TESTCASE 0

static void solve([[maybe_unused]] int tc) {
    int n;
    cin >> n;
    vector<long long> a(n);

    for (int i = 0; i < n; i++)cin >> a[i];

    if (n == 1) {
        cout << "0\n";
        return;
    }

    auto solve = [&](auto &solve, int pos, vector<long long> v) -> map<long long, long long> {
        if (v.size() == 0) {
            return map<long long, long long>();
        }
        if (v.size() == 2) {
            return map<long long, long long>{{v[0], v[1]},
                                             {v[1], v[0]}};
        }
        if (v.size() == 1) {
            return map<long long, long long>{{v[0], v[0]}};
        }

        //cout << pos << " bit\n";
        //for (auto i: v)cout << i << " ";
        //cout << "\n";

        map<long long, long long> res;
        int loop = -1;
        if (v.size() % 2 == 1) {
            for (int i = 0; i < (int) v.size(); i++) {
                if ((v[i] & ((1ll << pos) - 1)) == 0) {
                    res[v[i]] = v[i];
                    loop = v[i];
                    v.erase(v.begin() + i);

                    break;
                }
            }
        }
        //for (auto i: v)cout << i << " ";
        //cout << "\n";

        vector<long long> v0, v1;
        for (auto i: v) {
            if (i & (1ll << pos))v1.push_back(i);
            else v0.push_back(i);
        }

        map<long long, long long> sol0, sol1;
        sol0 = solve(solve, pos - 1, v0);
        sol1 = solve(solve, pos - 1, v1);

        map<long long, int> col;
        auto dfs = [&](auto &dfs, long long pos, int mode) -> void {
            //cout << pos << " dfs\n";
            if (col.find(pos) != col.end())return;
            col[pos] = mode;

            dfs(dfs, sol1[pos], mode ^ 1);

            if (sol0.find(pos ^ (1ll << pos)) != sol0.end())
                if (sol1.find(sol0[pos ^ (1ll << pos)] ^ (1ll << pos)) != sol1.end()) {
                    dfs(dfs, sol0[pos ^ (1ll << pos)] ^ (1ll << pos), mode ^ 1);
                }
        };


        for (auto i: v1)if (sol1[i] != i)dfs(dfs, i, 0);

        int loop0 = -1, loop1 = -1;

        for (auto [i, j]: sol0) {
            if (i == j)loop0 = i;
        }
        for (auto [i, j]: sol1) {
            if (i == j)loop1 = i;
        }

        if (loop0 != -1 && loop1 != -1) {
            sol0[loop0] = loop1;
            sol1[loop1] = loop0;
            loop0 = -1;
            loop1 = -1;
        }

        if (loop != -1 && loop1 != -1) {
            res[loop] = loop1;
            sol1[loop1] = loop;
            loop = -1;
            loop1 = -1;
        }

        if (loop0 != -1 && loop != -1) {
            sol0[loop0] = loop;
            res[loop] = loop0;
            loop0 = -1;
            loop = -1;
        }

        for (auto [i, j]: sol1) {
            if (col[i] == 1) {
                int a = i ^ (1ll << pos);
                int b = sol0[a];
                sol1[i] = b;
                sol1[j] = a;
                sol0[a] = j;
                sol0[b] = i;
            }
        }


        for (auto [i, j]: sol0)res[i] = j;
        for (auto [i, j]: sol1)res[i] = j;
        return res;
    };

    auto sol = solve(solve, 59, a);

    for (int i = 0; i < n; i++) {
        cout << sol[a[i]] << "\n";
    }
}

int main() {
    ios::sync_with_stdio(false);

    if (const char *f = getenv("REDIRECT_STDOUT"); f) {
        freopen(f, "w", stdout);
    }

    int T = 1;
#if TESTCASE
    cin >> T;
#endif

    for (int t = 1; t <= T; t++) {
        solve(t);
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 1ms
memory: 3612kb

input:

6
0
1
4
5
2
6

output:

4
6
0
2
5
1

result:

ok OK!

Test #2:

score: -100
Wrong Answer
time: 2ms
memory: 4020kb

input:

272
315
138
126
6
394
297
44
273
84
200
9
197
396
133
16
46
65
87
86
336
316
174
140
162
250
306
52
188
57
36
63
192
320
388
10
156
15
208
38
32
31
228
30
305
234
384
220
142
72
27
337
110
94
317
304
242
398
209
5
323
29
284
301
309
244
230
261
61
254
266
194
296
275
313
80
206
214
88
308
18
288
106...

output:

4
420
128
416
36
22
339
46
298
310
246
282
2
90
238
273
274
8
168
3
67
80
114
285
260
13
202
322
390
394
256
318
19
34
309
98
304
303
216
252
288
154
289
142
276
14
291
305
55
292
130
144
160
66
15
269
17
262
122
28
386
35
82
10
259
24
58
258
0
53
60
23
236
134
174
48
40
422
11
69
31
149
264
68
72
1...

result:

wrong answer Bit and of corresponding values not zero.