编号 题目 状态 分数 总时间 内存 代码 / 答案文件 提交者 提交时间
#45909 #1208. Day4F. ZJY 的幼儿园清扫案续章 Accepted 100 498 ms 5048 K C++ 17 / 2.4 K Leohh 2020-08-08 15:13:15
显示原始代码
#include <iostream>
#include <stdio.h>
#include <string.h>
#define MAX_S 50000
#define MAX_N 15
#define PRI 49993
#define OFFSET 3
#define MASK ((1 << OFFSET) - 1)
#define int long long
using namespace std;
const int dx[] = { -1, 0, 1, 0 };
const int dy[] = { 0, 1, 0, -1 };
struct HashTable {
    int sz;
    int head[PRI], nxt[MAX_S];
    int sta[MAX_S], val[MAX_S];
    void clear() {
        memset(head, 0, sizeof(head));
        sz = 0;
    }
    void push(int s, int v) {
        int id = s % PRI;
        for (int i = head[id]; i; i = nxt[i]) {
            if (sta[i] == s) {
                val[i] += v;
                return;
            }
        }
        sta[++sz] = s, val[sz] = v;
        nxt[sz] = head[id], head[id] = sz;
    }
    void roll() {
        for (int i = 1; i <= sz; i++) {
            sta[i] <<= OFFSET;
        }
    }
} h[2], &h0 = h[0], &h1 = h[1];
int n, K;
int b[MAX_N];
int bn[MAX_N];
bool flag[MAX_N][MAX_N][4];
int encode() {
    memset(bn, -1, sizeof(bn));
    int s = 0, tot = 0;
    bn[0] = 0;
    for (int i = n; i >= 0; i--) {
        if (bn[b[i]] == -1) {
            bn[b[i]] = ++tot;
        }
        s = (s << OFFSET) | bn[b[i]];
    }
    return s;
}
void decode(int s) {
    for (int i = 0; i <= n; i++) {
        b[i] = s & MASK;
        s >>= OFFSET;
    }
}
void push(int j, int dn, int rt, int v) {
    b[j] = dn, b[j + 1] = rt;
    h1.push(encode(), v);
}
bool ok(int x, int y) { return 0 <= x && x < n && 0 <= y && y < n; }
void setflag(int x, int y, int z) {
    flag[x][y][z] = true;
    if (z == 0) {
        if (ok(x, y + 1)) {
            flag[x][y + 1][2] = true;
        }
    } else if (z == 1) {
        if (ok(x + 1, y)) {
            flag[x + 1][y][3] = true;
        }
    } else if (z == 2) {
        if (ok(x, y - 1)) {
            flag[x][y - 1][0] = true;
        }
    } else {
        if (ok(x - 1, y)) {
            flag[x - 1][y][1] = true;
        }
    }
}
signed main() {
    cin >> n >> K;
    int x, y, z;
    for (int i = 1; i <= K; i++) {
        cin >> x >> y >> z;
        setflag(x - 1, y - 1, z - 1);
    }
    h1.clear();
    h1.push(0, 1);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            swap(h0, h1);
            h1.clear();
            for (int k = 1; k <= h0.sz; k++) {
                decode(h0.sta[k]);
                int v = h0.val[k];
                int lt = b[j], up = b[j + 1];
                bool dn = i != n - 1 && !flag[i][j][1], rt = j != n - 1 && !flag[i][j][0];
                if (lt && up) {
                    if (!flag[i][j][2] && !flag[i][j][3]) {
                        if (lt == up) {
                            if (i == n - 1 && j == n - 1) {
                                push(j, 0, 0, v);
                            }
                        } else {
                            for (int i = 0; i <= n; i++) {
                                if (b[i] == lt) {
                                    b[i] = up;
                                }
                            }
                            push(j, 0, 0, v);
                        }
                    }
                } else if (lt || up) {
                    if ((lt && !flag[i][j][2]) || (up && !flag[i][j][3])) {
                        int t = lt | up;
                        if (dn) {
                            push(j, t, 0, v);
                        }
                        if (rt) {
                            push(j, 0, t, v);
                        }
                    }
                } else {
                    if (dn && rt) {
                        push(j, n, n, v);
                    }
                }
            }
        }
        h1.roll();
    }
    int ans = (h1.sz ? h1.val[1] : 0) << 1;
    if (ans) {
        cout << ans << endl;
    } else {
        cout << "orz" << endl;
    }
}
子任务 #1
Accepted
得分:100
测试点 #1
Accepted
得分:100
用时:45 ms
内存:5036 KiB

输入文件(data0.in

12 119
11 5 2
5 7 3
11 9 2
6 2 4
2 12 4
3 4 1
10 5 3
10 9 3
12 12 3
5 12 4
8 7 4
4 3 2

<799 bytes omitted>

答案文件(data0.out

orz

用户输出

orz

系统信息

Exited with return code 0
测试点 #2
Accepted
得分:100
用时:48 ms
内存:5036 KiB

输入文件(data1.in

12 38
2 6 3
3 1 4
2 3 4
2 7 2
2 3 4
5 9 2
7 9 2
8 3 4
12 10 4
5 8 1
6 10 4
1 10 2
11 3 
<194 bytes omitted>

答案文件(data1.out

orz

用户输出

orz

系统信息

Exited with return code 0
测试点 #3
Accepted
得分:100
用时:216 ms
内存:5032 KiB

输入文件(hnd1.in

12 0

答案文件(hnd1.out

2152453777211211412

用户输出

2152453777211211412

系统信息

Exited with return code 0
测试点 #4
Accepted
得分:100
用时:62 ms
内存:5036 KiB

输入文件(data2.in

10 0

答案文件(data2.out

934520913216

用户输出

934520913216

系统信息

Exited with return code 0
测试点 #5
Accepted
得分:100
用时:19 ms
内存:5028 KiB

输入文件(hnd2.in

5 0

答案文件(hnd2.out

orz

用户输出

orz

系统信息

Exited with return code 0
测试点 #6
Accepted
得分:100
用时:15 ms
内存:5040 KiB

输入文件(data3.in

6 8
2 3 4
2 5 3
2 6 2
3 4 1
3 1 1
4 1 2
1 2 1
2 5 1

答案文件(data3.out

orz

用户输出

orz

系统信息

Exited with return code 0
测试点 #7
Accepted
得分:100
用时:11 ms
内存:5040 KiB

输入文件(hnd3.in

4 2
2 2 1
3 3 3

答案文件(hnd3.out

2

用户输出

2

系统信息

Exited with return code 0
测试点 #8
Accepted
得分:100
用时:42 ms
内存:5048 KiB

输入文件(data4.in

10 13
6 7 1
7 8 3
8 8 4
10 2 1
3 8 1
8 7 2
2 4 2
10 6 4
3 7 4
4 3 1
5 5 1
4 8 4
2 6 4

答案文件(data4.out

86448704

用户输出

86448704

系统信息

Exited with return code 0
测试点 #9
Accepted
得分:100
用时:10 ms
内存:4964 KiB

输入文件(hnd4.in

4 2
1 1 1
1 1 2

答案文件(hnd4.out

orz

用户输出

orz

系统信息

Exited with return code 0
测试点 #10
Accepted
得分:100
用时:30 ms
内存:5044 KiB

输入文件(hnd5.in

8 5
3 4 1
5 6 3
4 7 2
1 5 1
4 4 4

答案文件(hnd5.out

52732

用户输出

52732

系统信息

Exited with return code 0