QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#528092#5141. Identical ParitysyssWA 0ms3976kbC++203.1kb2024-08-23 08:15:302024-08-23 08:15:30

Judging History

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

  • [2024-08-23 08:15:30]
  • 评测
  • 测评结果:WA
  • 用时:0ms
  • 内存:3976kb
  • [2024-08-23 08:15:30]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;

struct Info {
    char op[2];
    int x, y;
};

int main() {
    int n, m;
    scanf("%d%d", &n, &m);
    while (n--) {
        int Solve, Time;
        scanf("%d%d", &Solve, &Time);
        int sum = 0, sumtime = 0;

        vector<int> p;
        vector<Info> info(m);
        int t = 0;
        for (auto &[op, x, y] : info) {
            scanf ("%s", op);
            if (op[0] == '+') {
                scanf("%d/%d", &x, &y);
                sum++;
                sumtime += (x - 1) * 20 + y;
            } else if (op[0] == '-') {
                scanf("%d", &x);
            } else if (op[0] == '?') {
                p.push_back(t);
                scanf("%d%d", &x, &y);
            } 
            t++;
        }
        if (sumtime > Time || sum > Solve) {
            printf ("No\n");
            continue;
        }

        bool ok = false;
        int siz = p.size();
        for (int i = 0; i < 1 << siz; i++) {
            int tot = 0;
            for (int j = 0; j < siz; j++) {
                if (i >> j & 1) {
                    tot ++;
                }
            }
            if (tot != Solve - sum) continue;
            int now = sumtime;
            int cnt = 0;
            for (int j = 0; j < siz; j++) {
                if (i >> j & 1) {
                    auto [op, x, y] = info[p[j]];
                    now += 239 + (y - x) * 20;
                    cnt += x;
                }
            }
            now += tot;
            if (Time < now) {
                continue;
            }
            if (Time > now + (cnt-tot) * 20 + 59 * tot) {
                continue;
            }
            
            for (int j = 0; j < siz; j++) {
                auto &[op, x, y] = info[p[j]];
                if (i >> j & 1) {
                    op[0] = '+';
                    int z = 0;
                    if (Time - now >= (x - 1) * 20) {
                        now += (x - 1) * 20;
                        x=y;
                    } else {
                        z = (Time - now) / 20;
                        now += z * 20;
                        x = (y - x) + z + 1;
                    }
                    if (Time - now >= 59) {
                        now += 59;
                        y = 299;
                    } else {
                        y = (Time - now) + 240;
                        now = Time;
                    }
                } else {
                    op[0] = '-';
                    x = y;
                }
            }
            ok = true;
            break;
        }

        if (ok) {
            printf("Yes\n");
            for (auto &[op, x, y] : info) {
                if (op[0] == '+') {
                    printf("+ %d/%d\n", x, y);
                } else if (op[0] == '-') {
                    printf("- %d\n", x);
                } else {
                    printf(".\n");
                }
            }
        } else {
            printf("No\n");
        }
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

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

input:

3
3 1
4 2
5 3

output:

No
No
No

result:

wrong answer expected YES, found NO [2nd token]