QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#618524#8. 奇数国ucup-team49060 0ms30128kbC++173.7kb2024-10-06 23:12:232024-10-06 23:12:24

Judging History

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

  • [2024-10-06 23:12:24]
  • 评测
  • 测评结果:0
  • 用时:0ms
  • 内存:30128kb
  • [2024-10-06 23:12:23]
  • 提交

answer

//by 72
#include<bits/stdc++.h>
#define F(i, a, b) for(int i = a; i <= b; i ++)
#define Fd(i, a, b) for(int i = a; i >= b; i --)
#define pb push_back
#define pii pair<int, int>
#define fi first
#define se second
// #define int long long
using namespace std;

const int mod = 998244353;
const int N = 1e6 + 10;
const int M = 1e4 + 10;
// const int inf = 1e18;
typedef array<int, 3> a3; 
typedef long long ll;

int n, m, f[N], sz1[N], sz2[N], rt[N], qsy[N];
pii a[N];
int find(int x) {return x == f[x] ? x : find(f[x]);}

int s[N], tot = 0; 
// 扩展域并查集
bool merge(int x, int y) {
    int p = find(x), q = find(y);
    if(p == q) return false;
    if(sz1[p] + sz2[p] < sz1[q] + sz2[q]) swap(p, q);
    f[q] = p, rt[q] = 0;
    sz1[p] += sz1[q], sz2[p] += sz2[q];
    s[++ tot] = q;
    return true;
}
void del(){//删除栈顶边
    if(! tot) return;
    int y = s[tot --]; sz1[f[y]] -= sz1[y], sz2[f[y]] -= sz2[y];
    f[y] = y, rt[y] = 1;
}
int cnt[N];

int dp[M][M / 2], pre[M][M / 2];
pii now[N];

void sol() {
    cin >> n >> m;
    F(i, 1, 4 * n) {
        f[i] = i, rt[i] = 1;
        if(i <= 2 * n) sz1[i] = 1, sz2[i] = 0;
        else sz2[i] = 1, sz1[i] = 0;
    }
    F(i, 1, m) cin >> a[i].fi >> a[i].se;
    Fd(i, m, 1) {
        auto [u, v] = a[i];
        if(find(u) == find(v)) continue;
        int sum = 0, qsyy = tot;
        if(! merge(u, v + 2 * n)) continue;
        merge(v, u + 2 * n);
        int mx = 0;
        F(j, 1, 4 * n) if(rt[j]) { 
            // 保证每个连通块会被遍历两次,两次中的集合互为反点
            int x = sz1[j], y = sz2[j];
            if(x > y) swap(x, y);
            mx = max(mx, y - x);
            sum += x, cnt[y - x] ++;
        }
        sum /= 2;
        // vector<pii> now;
        int idx = 0;
        F(j, 1, mx) if(cnt[j]) now[++ idx] = {j, cnt[j] / 2}, cnt[j] = 0;
        sum = n - sum; // 背出这么多
        bitset<5001> g;
        g[0] = 1;
        F(j, 1, idx) {
            auto [x, y] = now[j];
            if(g[sum]) break;
            for(int j = 0, now; y; j ++) {
                now = min(1 << j, y), y -= now;
                g |= g << (now * x);
            }
        }
        if(! g[sum]) {
            while(tot != qsyy) del();
        }
    }
    // 对于每一个连通块标记 0 表示里面的 <= 2 * n 为 0 反之为 1
    vector<a3> tmp;
    // F(i, 1, 4 * n) cout << i << " " << find(i) << "!\n";
    F(i, 1, 4 * n) if(rt[i]) {
        tmp.push_back({i, sz1[i], sz2[i]});
        rt[find(i + 2 * n)] = 0; // 保留这个集合 把另一个删了
    }
    dp[0][0] = 1;
    assert(tmp.size() < M);
    for(int i = 0; i < tmp.size(); i ++) {
        auto [id, x, y] = tmp[i];
        F(j, 0, n) if(dp[i][j]) {
            if(j + x <= n) dp[i + 1][j + x] = 1, pre[i + 1][j + x] = j;
            if(j + y <= n) dp[i + 1][j + y] = 1, pre[i + 1][j + y] = j;
        }
    }
    int now = n;
    Fd(i, tmp.size(), 1) {
        auto [id, x, y] = tmp[i - 1];
        // cout << id << " " << x << " " << y << "!\n";
        int qaq = now - pre[i][now];
        now = pre[i][now];
        if(qaq == y) qsy[id] = 1;
        // cout << now << "??\n";
        // 0 代表小于等于2*n的选0
    }
    vector<int> res(2 * n + 1);
    F(i, 1, 4 * n) if(rt[find(i)]) {
        // cout << i << "??\n";
        int flag = qsy[find(i)];
        // cout << flag << "!!\n";
        if(i <= 2 * n) res[i] = flag;
        else res[i - 2 * n] = flag ^ 1;
    }
    F(i, 1, 2 * n) cout << res[i]; cout << "\n";
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t = 1;
    F(i, 1, t) sol();
    return 0;
}
//sldl

Details

Tip: Click on the bar to expand more detailed information

Pretests


Final Tests

Test #1:

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

input:

122
1 47 84606
1 39 10304
0 31 46
0 47 50
1 16 80142
1 15 55620
1 56 8487
1 22 65813
0 17 28
1 45 73139
0 41 47
1 15 73640
1 40 44390
1 68 70490
0 63 69
0 39 40
0 12 16
1 25 3444
0 25 27
1 18 31800
1 60 89056
1 60 52890
0 53 60
0 53 60
1 63 3243
1 54 9100
0 51 59
1 35 36461
1 61 52428
0 55 61
1 50 6...

output:

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111

result:

wrong answer 1st lines differ - expected: '3448280', found: '000000000000000000000000000000...1111111111111111111111111111111'

Test #2:

score: 0
Runtime Error

input:

10000
1 3204 2085
0 3193 3210
0 5567 5581
0 5070 5093
1 7744 53578
0 7726 7744
1 5938 90890
0 5933 5946
1 2282 404
0 2275 2293
0 5529 5552
0 5411 5427
1 1288 83658
1 1691 75254
1 8728 1909
1 9085 92560
0 9068 9085
0 8728 8731
1 6452 52632
0 6444 6458
0 1691 1704
0 1270 1288
0 5233 5248
0 5400 5420
0...

output:


result:


Test #3:

score: 0
Runtime Error

input:

20000
0 4519 6399
0 5538 5991
0 5830 7147
1 5838 256887
0 5544 7321
1 3889 10561
1 2843 775260
0 1555 2973
0 2570 5389
0 5338 6500
1 9416 950309
1 5569 690690
1 3145 135315
1 2365 35167
1 3940 43
1 5310 5353
1 8337 568841
1 5796 169
1 3104 746130
0 2515 3432
1 10626 35611
0 8635 12588
1 10562 946774...

output:


result:


Test #4:

score: 0
Runtime Error

input:

30000
1 12080 458075
0 9890 15050
1 7144 149
0 4091 10808
1 5942 843378
0 2599 9264
1 9921 6647
0 6378 12730
1 8131 602651
0 5475 11565
1 9005 870870
0 6625 12774
1 11492 690690
0 8194 14863
1 4340 256
0 918 6863
1 7069 344488
0 3763 10001
1 12418 8192
0 9118 15941
1 11125 690690
0 8462 14279
1 9951...

output:


result:


Test #5:

score: 0
Runtime Error

input:

50000
1 29347 187726
0 25914 32532
1 20674 8192
0 15953 24784
1 24117 4752
0 19706 27975
1 22413 538
0 18457 27027
1 25177 931944
0 20749 29602
1 25822 52728
0 22542 28875
1 27405 746130
0 23587 31278
1 24494 24187
0 20318 27988
1 23628 85158
0 20006 28203
1 20524 24389
0 16166 24111
1 29127 733825
...

output:


result:


Test #6:

score: 0
Runtime Error

input:

60000
1 6 2
1 12 3
1 18 5
1 24 7
1 30 11
1 36 13
1 42 17
1 48 19
1 54 23
1 60 29
1 66 31
1 72 37
1 78 41
1 84 43
1 90 47
1 96 53
1 102 59
1 108 61
1 114 67
1 120 71
1 126 73
1 132 79
1 138 83
1 144 89
1 150 97
1 156 101
1 162 103
1 168 107
1 174 109
1 180 113
1 186 127
1 192 131
1 198 137
1 204 139
...

output:


result:


Test #7:

score: 0
Runtime Error

input:

70000
1 7 2
1 14 3
1 21 5
1 28 7
1 35 11
1 42 13
1 49 17
1 56 19
1 63 23
1 70 29
1 77 31
1 84 37
1 91 41
1 98 43
1 105 47
1 112 53
1 119 59
1 126 61
1 133 67
1 140 71
1 147 73
1 154 79
1 161 83
1 168 89
1 175 97
1 182 101
1 189 103
1 196 107
1 203 109
1 210 113
1 217 127
1 224 131
1 231 137
1 238 13...

output:


result:


Test #8:

score: 0
Runtime Error

input:

80000
1 8 2
1 16 3
1 24 5
1 32 7
1 40 11
1 48 13
1 56 17
1 64 19
1 72 23
1 80 29
1 88 31
1 96 37
1 104 41
1 112 43
1 120 47
1 128 53
1 136 59
1 144 61
1 152 67
1 160 71
1 168 73
1 176 79
1 184 83
1 192 89
1 200 97
1 208 101
1 216 103
1 224 107
1 232 109
1 240 113
1 248 127
1 256 131
1 264 137
1 272 ...

output:


result:


Test #9:

score: 0
Runtime Error

input:

90000
1 9 2
1 18 3
1 27 5
1 36 7
1 45 11
1 54 13
1 63 17
1 72 19
1 81 23
1 90 29
1 99 31
1 108 37
1 117 41
1 126 43
1 135 47
1 144 53
1 153 59
1 162 61
1 171 67
1 180 71
1 189 73
1 198 79
1 207 83
1 216 89
1 225 97
1 234 101
1 243 103
1 252 107
1 261 109
1 270 113
1 279 127
1 288 131
1 297 137
1 306...

output:


result:


Test #10:

score: 0
Runtime Error

input:

100000
1 10 2
1 20 3
1 30 5
1 40 7
1 50 11
1 60 13
1 70 17
1 80 19
1 90 23
1 100 29
1 110 31
1 120 37
1 130 41
1 140 43
1 150 47
1 160 53
1 170 59
1 180 61
1 190 67
1 200 71
1 210 73
1 220 79
1 230 83
1 240 89
1 250 97
1 260 101
1 270 103
1 280 107
1 290 109
1 300 113
1 310 127
1 320 131
1 330 137
1...

output:


result: