关于 SPJ
查看原帖
关于 SPJ
129562
XYY1411楼主2021/7/9 10:18
The town numbers can be given in an arbitrary order.

If more than one solution exists, any solution can be printed.

提供本题 SPJ

#include <bitset>
#include "testlib.h"
using namespace std;
int n, m, k, r;
const int maxn = 5e5 + 5, maxm = 1e6 + 5;
bitset<maxn> vis;
struct edge {
    int v;
    int n;
} e[maxm << 1];
int head[maxn], tot = 0;
inline void link(int u, int v) {
    e[++tot] = (edge){v, head[u]};
    head[u] = tot;
}
int u, v, t;
void dfs(int u, int f, int dep) {
    vis[u] = true;
    if (dep == 2) return;
    for (int i = head[u]; i; i = e[i].n) {
        v = e[i].v;
        if (v != f) dfs(v, u, dep + 1);
    }
}
bool ispe = false;
int main(int argc, char** argv) {
    registerTestlibCmd(argc, argv);
    n = inf.readInt(), m = inf.readInt(), k = inf.readInt();
    if (ouf.eof()) {
        quitf(
            _wa,
            "Wrong Anwser. Parameter r not found. You should check your output "
            "function, qwq.");
        return 0;
    }
    r = ouf.readInt();
    if (r > k) {
        quitf(_wa,
              "Wrong Anwser. You can't erect more than %d towers, but you "
              "have erected %d towers. Don't give up, qwq.",
              k, r);
        return 0;
    }
    for (int i = 1; i <= m; ++i) {
        u = inf.readInt(), v = inf.readInt();
        link(u, v), link(v, u);
    }
    while (ouf.curChar() == ' ') ouf.skipChar();
    if (!ouf.eoln()) ispe = true;
    for (int i = 1; i <= r; ++i) {
        while (ouf.curChar() == ' ') ouf.skipChar();
        if (ouf.eof()) {
            quitf(_wa,
                  "Wrong Anwser. More output needed, you should erect %d "
                  "towers, but %d erected. So how did you get r, @_@?",
                  r, i - 1);
            return 0;
        }
        if (ouf.eoln()) ispe = true;
        t = ouf.readInt();
        dfs(t, -1, 0);
    }
    inf.skipBlanks(), ouf.skipBlanks();
    if (!ouf.eof()) {
        quitf(_wa, "Wrong Anwser. Too much output, @_@.");
        return 0;
    }
    inf.readEof(), ouf.readEof();
    if (vis.count() != n)
        quitf(_wa,
              "Wrong Anwser. You still have %d points that you haven't "
              "covered. Try again, qwq.",
              n - vis.count());
    else if (ispe)
        quitf(_pe, "Presentation Error. SPJ is not stupid, >.<.");
    else
        quitf(_ok, "Accept. Good job, orz.");
    return 0;
}
2021/7/9 10:18
加载中...