QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#465068 | #5523. Graph Problem With Small $n$ | BalintR | WA | 936ms | 139448kb | C++20 | 4.3kb | 2024-07-06 17:10:16 | 2024-07-06 17:10:17 |
Judging History
answer
#include <stdio.h>
using namespace std;
#pragma GCC target "avx2"
#pragma GCC optimize "Ofast"
#include <immintrin.h>
typedef __m256i m256;
typedef unsigned uint;
typedef long long ll;
typedef unsigned long long ull;
#define ms(a, x) memset(a, x, sizeof(a))
#define pb push_back
#define fs first
#define sn second
#define ALL(v) begin(v), end(v)
#define SZ(v) ((int) (v).size())
#define lbv(v, x) (lower_bound(ALL(v), x) - (v).begin())
#define ubv(v, x) (upper_bound(ALL(v), x) - (v).begin())
const int INF = 0x3f3f3f3f;
const ll LLINF = 0x3f3f3f3f3f3f3f3f;
#define FR(i, n) for(int i = 0; i < (n); i++)
#define FOR(i, a, b) for(int i = (a); i < (b); i++)
#define FORR(i, a, b) for(int i = (a); i >= (b); i--)
#define dbg(x) {cerr << #x << ' ' << x << endl;}
#define dbgArr(arr, n) {cerr << #arr; FR(_i, n) cerr << ' ' << (arr)[_i]; cerr << endl;}
#define vload(ptr) _mm256_loadu_si256((m256*) (ptr))
#define vstore(ptr, v) _mm256_storeu_si256((m256*) (ptr), (v))
#define vand(a, b) _mm256_and_si256(a, b)
#define vor(a, b) _mm256_or_si256(a, b)
#define vxor(a, b) _mm256_xor_si256(a, b)
#define vblendPs(a, b, c) (m256) _mm256_blendv_ps((__m256) (a), (__m256) (b), (__m256) (c))
const int C24_11 = 2496144;
const int C24_12 = 2704156;
const int MASK = (1 << 24) - 1;
const int MN = 24;
int n, mask;
int adjMat[MN], iAdjMat[MN];
bool ans[MN][MN];
int dpMem[C24_11+C24_12][8], (*dpMem1)[8] = dpMem, (*dpMem2)[8] = dpMem+C24_11;
int byPop[MN+2];
char mp[3<<MN], popMem[3<<MN];
#define atMp(i) (*(int*) (mp + (i)*3))
#define atPopMem(i) (*(int*) (popMem + (i)*3))
void solve(int pop, int oldDp[][8], int newDp[][8]){
m256 zeroV = _mm256_setzero_si256();
m256 allOne = _mm256_set1_epi32(-1);
m256 vAdj[MN];
FR(i, MN) vAdj[i] = _mm256_set1_epi32(adjMat[i]);
FR(i1, byPop[pop+1]-byPop[pop]){
int s1 = atPopMem(byPop[pop]+i1) & MASK;
m256 nsv = vxor(_mm256_set1_epi32(s1), allOne);
m256 tmp = vand(vload(oldDp[i1]), nsv);
vstore(oldDp[i1], zeroV);
#define proc(n2){ \
int s2 = s1 | (1 << n2); \
int i2 = atMp(s2) & MASK; \
m256 oldV = vload(newDp[i2]); \
m256 newV = vor(oldV, vAdj[n2]); \
m256 maskV = _mm256_slli_epi32(tmp, 31-n2); \
vstore(newDp[i2], vblendPs(oldV, newV, maskV)); \
}
proc(0);
proc(1);
proc(2);
proc(3);
proc(4);
proc(5);
proc(6);
proc(7);
proc(8);
proc(9);
proc(10);
proc(11);
proc(12);
proc(13);
proc(14);
proc(15);
proc(16);
proc(17);
proc(18);
proc(19);
proc(20);
proc(21);
proc(22);
proc(23);
}
}
void solve(int *ord){
FR(i, n) adjMat[i] = 0;
FR(i, n) FR(j, n) adjMat[i] |= ((iAdjMat[ord[i]] >> ord[j]) & 1) << j;
int (*oldMem)[8] = dpMem2, (*newMem)[8] = dpMem1;
FR(n1, 8) oldMem[0][n1] = adjMat[n1];
FR(pop, n-2){
solve(pop, oldMem, newMem);
auto tmp = oldMem;
oldMem = newMem, newMem = tmp;
}
FR(i, 8) FR(j, n) if(i != j){
ans[ord[i]][ord[j]] = (oldMem[atMp(mask^(1<<i)^(1<<j)) & MASK][i] >> j) & 1;
}
m256 zeroV = _mm256_setzero_si256();
FR(i, byPop[n-1]-byPop[n-2]) vstore(oldMem+i, zeroV);
}
int choose[MN+1][MN+1];
void init(){
FR(a, MN+1){
choose[a][0] = 1;
FOR(b, 1, a+1) choose[a][b] = choose[a-1][b-1] + choose[a-1][b];
}
FR(i, n+1) byPop[i+1] = byPop[i] + choose[n][i];
int ind[MN+1] = {};
FR(s, 1<<n){
int pop = __builtin_popcount(s);
atMp(s) |= ind[pop];
atPopMem(byPop[pop] + ind[pop]++) |= s;
}
}
int main(){
scanf("%d\n", &n);
FR(i, n){
FR(j, n) iAdjMat[i] |= (getchar()-'0') << j;
getchar();
}
//n = 24;
//FR(i, n) FR(j, i) if(rng() & 1) iAdjMat[i] |= 1 << j, iAdjMat[j] |= 1 << i;
mask = (1<<n)-1;
init();
int ord[MN];
FR(i, MN) ord[i] = i;
solve(ord);
FR(i, n) ord[i] = (i+8) % 24;
solve(ord);
FR(i, n) ord[i] = (i+16) % 24;
solve(ord);
FR(i, n){
FR(j, n) putchar('0'+ans[i][j]);
putchar('\n');
}
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 5548kb
input:
4 0110 1010 1101 0010
output:
0001 0001 0000 1100
result:
ok 4 lines
Test #2:
score: 0
Accepted
time: 1ms
memory: 5656kb
input:
6 010001 101000 010100 001010 000101 100010
output:
010001 101000 010100 001010 000101 100010
result:
ok 6 lines
Test #3:
score: 0
Accepted
time: 0ms
memory: 5500kb
input:
4 0111 1011 1101 1110
output:
0111 1011 1101 1110
result:
ok 4 lines
Test #4:
score: 0
Accepted
time: 905ms
memory: 139448kb
input:
23 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 000000000...
output:
00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 000000000000...
result:
ok 23 lines
Test #5:
score: 0
Accepted
time: 936ms
memory: 139424kb
input:
23 00010100000000000101000 00000000010000000001000 00000000000001000000001 10000000000000000010000 00000000000000000000000 10000000000000000000000 00000001000000000000000 00000010000000000010000 00000000000001000000000 01000000000000000000000 00000000000000000000000 00000000000000000000000 000000000...
output:
00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 000000000000...
result:
ok 23 lines
Test #6:
score: 0
Accepted
time: 928ms
memory: 139388kb
input:
23 00001000000000000000000 00001000010001000000000 00000000000101000010000 00001000000100000000000 11010000010011000100000 00000000000100000000000 00000000000000000000001 00000000000000000101000 00000000000000000000000 01001000000000101010010 00000000000000000000101 00110100000010001000000 000010000...
output:
00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 000000000000...
result:
ok 23 lines
Test #7:
score: 0
Accepted
time: 933ms
memory: 139300kb
input:
23 01000000000001101001100 10000001101000000000000 00000100000100010000100 00000000000000001011000 00000100001000000000000 00101000000000001000001 00000000000000000000000 01000000000000000000000 01000000000100000010000 00000000000001000000011 01001000000000010000000 00100000100001000100001 000000000...
output:
00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 000000000000...
result:
ok 23 lines
Test #8:
score: -100
Wrong Answer
time: 926ms
memory: 139412kb
input:
23 00000000010001001001010 00100010001101110000001 01000001000100110000000 00000011010001101100100 00000000010000010001000 00000000000000001001000 01010001000000000000001 00110010000000000000010 00000000011000100100000 10011000101000100000000 01000000110010101010000 01100000000000000000000 000000000...
output:
01111111110111110110111 10011111110111110110111 10011111110111110110111 11101111110110110110111 11110111110111110110111 11111011110111111111111 11111101110111110110111 11111110110111110110111 00000000000000000000000 00000000000000000000000 00000000000000000000000 00000000000000000000000 000000000000...
result:
wrong answer 9th lines differ - expected: '11111111010111110110111', found: '00000000000000000000000'