QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#518244#2760. SimurghDimash0 2ms9196kbC++204.2kb2024-08-13 18:44:242024-08-13 18:44:24

Judging History

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

  • [2024-08-13 18:44:24]
  • 评测
  • 测评结果:0
  • 用时:2ms
  • 内存:9196kb
  • [2024-08-13 18:44:24]
  • 提交

answer

#include "simurgh.h"
#include <bits/stdc++.h>
using namespace std;

const int N = 512 * 512,M = 512;
int dat[N],dep[N],vis[N],m,w[N],p[N],pos[N];
bool in[N];
vector<int> tr;
vector<pair<int,int>>g[N];
void dfs(int v) {
    vis[v] = 1;
    for(auto [to,i]:g[v]) {
        if(vis[to]) continue;
        dep[to] = dep[v] + 1;
        tr.push_back(i);in[i] = 1;
        w[to] = i;p[to] = v;
        dfs(to);
    }
}
vector<int> upd(int i,int j) {
    vector<int> f = tr;
    f.erase(f.begin() + pos[i]);
    f.push_back(j);
    return f;
}
int P[N];
int get(int v) {
    if(P[v] == v) return v;
    return P[v] = get(P[v]);
}
bool merge(int a,int b) {
    a = get(a);
    b = get(b);
    if(a == b) return false;
    P[a] = b;
    return true;
}
vector<int> find_roads(int n, vector<int> u, vector<int> v) {
    m = (int)v.size();
    for(int i = 0;i < (int)u.size();i++) {
        g[u[i]].push_back({v[i],i});
        g[v[i]].push_back({u[i],i});
    }
    dfs(0);
    for(int i = 0;i < n - 1;i++) {
        pos[tr[i]] = i;
    }
    memset(dat,-1,sizeof(dat));
    int ct = count_common_roads(tr);
    for(int i = 0;i < m;i++) {
        if(in[i]) continue;
        if(dep[u[i]] > dep[v[i]]) {
            swap(u[i],v[i]);
        }
        int x = v[i];
        vector<int> t;
        while(x != u[i]) {
            t.push_back(w[x]);
            x = p[x];
        }
        sort(t.begin(),t.end(),[&](int x,int y) {
            return dat[x] < dat[y];
        });
        if(dat[t[0]] != -1) continue;
        int tp = -1;
        if(dat[t.back()] == -1) {
            vector<int> bf;
            for(int j:t) {
                vector<int> f = upd(j,i);
                int c = count_common_roads(f);
                if(c == ct + 1) {
                    tp = 1;
                    dat[j] = 0;
                } else if(c == ct - 1) {
                    tp = 0;
                    dat[j] = 1;
                } else {
                    bf.push_back(j);
                }
            }
            if(tp == -1) {
                tp = 0;
            }
            for(int j:bf) {
                dat[j] = tp;
            }
        } else {
            int c = count_common_roads(upd(t.back(),i));
            if(c == ct) {
                tp = dat[t.back()];
            } else if(c == ct - 1) {
                tp = 0;
            } else {
                tp = 1;
            }
            for(int j:t) {
                if(dat[j] != -1) continue;
                c = count_common_roads(upd(j,i));
                if(c == ct) {
                    dat[j] = tp;
                } else if(c == ct - 1) {
                    dat[j] = 1;
                } else {
                    dat[j] = 0;
                }
            }
        }
    }
    int left = (n - 1) - ct;
    for(int i = 0;i < n && left;i++) {
        int it = 0;
        auto check = [&](int l,int r)->bool {
            iota(P,P+n,0);
            vector<int> A;
            for(int j = l;j <= r;j++) {
                merge(i,g[i][j].first);
                A.push_back(g[i][j].second);
            }
            int _ = 0;
            for(int k:tr) {
                if(merge(u[k],v[k])) {
                    _ += dat[k];
                    A.push_back(k);
                }
            }
            _ = count_common_roads(A) - _;
            return (_ > 0);
        };
        for(int j = (int)g[i].size() - 1;j >= 0;--j) {
            if(in[g[i][j].second]) {
                g[i].erase(g[i].begin() + j);
            }
        }
        // cout << i << ' ' << (int)g[i].size() << '\n';
        while(it < (int)g[i].size()) {
            int l = it - 1,r = (int)g[i].size();
            while(r - l  > 1) {
                int mid = (l + r) >> 1;
                if(check(it,mid)) {
                    r = mid; 
                } else {
                    l = mid;
                }
            }
            if(r == (int)g[i].size()) break;
            dat[g[i][r].second] = 1;
            it = r + 1;
        }
    }
    tr.clear();
    for(int i = 0;i < m;++i) {
        if(dat[i] == 1) {
            tr.push_back(i);
        }
    }
    return tr;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 13
Accepted
time: 0ms
memory: 9196kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
7 21 30000
2 0
0 1
5 2
2 6
1 3
3 0
6 0
4 5
3 2
4 0
1 4
0 5
4 3
4 6
6 1
2 1
5 3
2 4
5 6
5 1
6 3
7 10 9 13 12 17

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
OK
7 9 10 12 13 17

result:

ok correct

Test #2:

score: 13
Accepted
time: 2ms
memory: 6832kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
7 21 30000
4 6
1 6
2 3
0 3
2 1
2 6
5 6
6 3
0 2
1 0
4 2
1 3
5 2
5 0
0 6
5 3
4 5
5 1
3 4
1 4
4 0
4 16 10 0 20 18

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
OK
0 4 10 16 18 20

result:

ok correct

Test #3:

score: 13
Accepted
time: 2ms
memory: 8944kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
7 21 30000
2 5
0 4
4 5
4 3
5 3
1 3
3 6
4 1
6 0
5 6
6 2
6 1
6 4
3 2
2 1
1 0
0 2
5 0
5 1
4 2
0 3
20 17 15 9 2 19

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
OK
2 9 15 17 19 20

result:

ok correct

Test #4:

score: 13
Accepted
time: 1ms
memory: 6876kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
7 13 30000
2 4
4 3
3 2
0 3
0 4
6 3
6 1
4 5
6 2
1 3
5 6
6 0
6 4
3 9 12 7 0 4

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
OK
0 3 4 7 9 12

result:

ok correct

Test #5:

score: 13
Accepted
time: 0ms
memory: 9168kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
6 10 30000
5 2
0 1
1 2
0 3
3 2
1 4
0 5
3 5
4 3
1 3
5 0 7 2 1

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
OK
0 1 2 5 7

result:

ok correct

Test #6:

score: 13
Accepted
time: 1ms
memory: 8940kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
7 16 30000
3 4
2 5
2 1
0 5
1 5
0 2
2 6
6 1
4 6
0 1
2 3
6 3
3 1
1 4
4 5
3 5
0 9 5 15 3 11

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
OK
0 3 5 9 11 15

result:

ok correct

Test #7:

score: 0
Wrong Answer
time: 1ms
memory: 8872kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
2 1 30000
0 1
0

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
WA
NO

result:

wrong answer WA in grader: NO

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Skipped

Dependency #2:

0%

Subtask #4:

score: 0
Wrong Answer

Test #58:

score: 0
Wrong Answer
time: 0ms
memory: 9160kb

input:

wrslcnopzlckvxbnair_input_simurgh_lmncvpisadngpiqdfngslcnvd
2 1 12000
1 0
0

output:

lxndanfdiadsfnslkj_output_simurgh_faifnbsidjvnsidjbgsidjgbs
WA
NO

result:

wrong answer WA in grader: NO

Subtask #5:

score: 0
Skipped

Dependency #1:

0%