Submission #1091853

# Submission time Handle Problem Language Result Execution time Memory
1091853 2024-09-22T10:34:43 Z _8_8_ Super Dango Maker (JOI22_dango3) C++17
7 / 100
10000 ms 3112 KB
#include "dango3.h"
#include <bits/stdc++.h>
#include <vector>
using namespace std;
    
int n, m;
const int N = 401;
bool bad[N * 26];
int B = -1;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
typedef long long ll;
unordered_map<ll, int> mem;

int qr(vector<int> f) {
    sort(f.begin(), f.end());
    ll it = 1, p = 37, mod = (int)998244353, h = 0;
    for(int i:f) {
        h += it * 1ll * i % mod;
        if(h >= mod) h -= mod;
        it = it * p % mod;
    }
    if(mem.count(h)) return mem[h];
    return mem[h] = Query(f);
}
vector<int> get(vector<int> &a, vector<int> &b) {
    for(int j:a) {
        bad[j] = 0;
    }
    int lst = 0;
    vector<int> ret;
    int new_B = -1;
    for(int i = 0; i < m; i++) {
        int l = lst - 1, r = (int)a.size() - 1;
        
        if(B != -1 && i == 0) {
            r = B;
        }
        int left = m - i;
        if(left == (int)a.size() - lst) {
            for(int j = lst; j < (int)a.size(); j++) {
                ret.push_back(a[j]);
            }
            break;
        }
        while(r - l > 1) {
            int mid = (l + r) >> 1;
            vector<int> t = b;
            for(int j = 0; j <= mid; j++) {
                if(!bad[a[j]])t.push_back(a[j]);
            }
            if(qr(t)) {
                r = mid;
            } else {
                l = mid; 
            }
        }
        lst = r + 1;
        ret.push_back(a[r]);
        bad[a[r]] = 1;
        if(i == 0 && B == -1) {
            new_B = r - 1;
        }
    }
    B = new_B;
    return ret;
}
vector<int> res[N];
int timer = 0, vis[N * 26];
void Solve(int _n, int _m) {
    n = _n, m = _m;
    vector<int> f, bf;
    for(int i = 1; i <= n * m; i++) {
        f.push_back(i);
    }
    shuffle(f.begin(), f.end(), rng);
    for(int i = 0; i < n; i++) {
        timer++;    
        vector<int> nv = get(f, bf);
        bf.push_back(nv[0]);
        for(int j = 0; j < m; j++) {
            // cout << nv[j] << ' ';
            res[j].push_back(nv[j]);
            vis[nv[j]] = timer;
        }
        // cout << '\n';
        vector<int> sw;
        for(int j:f) {
            if(vis[j] != timer) {
                sw.push_back(j);
            }
        }
        f = sw;
    }
    for(int i = 0; i < m; i++) {
        Answer(res[i]);
    }
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 0 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 0 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 104 ms 848 KB Output is correct
2 Correct 102 ms 848 KB Output is correct
3 Correct 107 ms 788 KB Output is correct
4 Correct 101 ms 848 KB Output is correct
5 Correct 106 ms 624 KB Output is correct
6 Correct 103 ms 628 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 3468 ms 2992 KB Output is correct
2 Incorrect 3446 ms 2988 KB Wrong Answer [7]
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Execution timed out 10034 ms 3112 KB Time limit exceeded
2 Halted 0 ms 0 KB -