记录编号 38771 评测结果 AAAAA
题目名称 [IOI 1998] 灯光 最终得分 100
用户昵称 Gravatar王者自由 是否通过 通过
代码语言 C++ 运行时间 0.014 s
提交时间 2012-06-12 20:54:45 内存使用 0.00 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <cstdlib>
const int N = 100 + 10;
struct light {
    char c[N];
} a[20];
int n, c, t, x[N], y[N];
int i, j, k, l, r;
int cmp(const void *a, const void *b) {
    char *c1, *c2;
    c1 = (*(light *)a).c;
    c2 = (*(light *)b).c;
    return strcmp(c1, c2);
}
inline void state(int i) {
    a[t].c[i] = '1' - a[t].c[i] + '0';
}
bool ok(int i) {
    if(strcmp(a[i].c, a[i-1].c) == 0) return false;
    for(j=1; j<=x[0]; j++) if(a[i].c[x[j]-1] == '0') return false;
    for(j=1; j<=y[0]; j++) if(a[i].c[y[j]-1] == '1') return false;
    return true;
}
int main() {
    freopen("partya.in", "r", stdin);
    freopen("partya.out", "w", stdout);
    scanf("%d%d", &n, &c);
    i = 1; while(scanf("%d", x+i), x[i] >= 0) i++; x[0] = i - 1;
    i = 1; while(scanf("%d", y+i), y[i] >= 0) i++; y[0] = i - 1;
    // 少年,5 s 不该枚举么?
    for(i=0; i<2; i++) for(j=0; j<2; j++)
        for(k=0; k<2; k++) for(l=0; l<2; l++) {
            if((r = i + j + k + l) > c) continue;
            if(r % 2 != c % 2) continue;
            memset(a[++t].c, '1', n);
            if(i) for(r=0; r<n; r+=1) state(r);
            if(j) for(r=0; r<n; r+=2) state(r);
            if(k) for(r=1; r<n; r+=2) state(r);
            if(l) for(r=0; r<n; r+=3) state(r);
        }
    qsort(a+1, t, sizeof(light), cmp);
    for(i=1; i<=t; i++)
        if(ok(i)) puts(a[i].c);
    return 0;
}