1.18
继续插头dp。
HDU 1964 Pipes
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long LL; 7 int N, M, ex, ey; 8 char G[44][44]; 9 10 const int HASH = 10007; 11 const int STATE = 1111111; 12 struct HashMap 13 { 14 int sz, h[HASH]; 15 int nxt[STATE]; 16 int val[STATE]; 17 LL key[STATE]; 18 19 void init() 20 { 21 sz = 0; 22 memset(h, 0, sizeof(h)); 23 } 24 25 void push(LL Key, int Val) 26 { 27 int t = Key % HASH; 28 for(int i = h[t]; i; i = nxt[i]) 29 if(key[i] == Key) {val[i] = min(val[i], Val); return;} 30 nxt[++sz] = h[t]; 31 key[sz] = Key, val[sz] = Val; 32 h[t] = sz; 33 } 34 } H[2]; 35 36 void decode(int * code, LL st) 37 { 38 for(int i = M; i >= 0; i--) 39 { 40 code[i] = st & 7LL; 41 st >>= 3LL; 42 } 43 } 44 45 int ch[22]; 46 LL encode(int * code) 47 { 48 LL st = 0; 49 memset(ch, -1, sizeof(ch)); 50 int cnt = ch[0] = 0; 51 for(int i = 0; i <= M; i++) 52 { 53 if(ch[code[i]] == -1) ch[code[i]] = ++cnt; 54 code[i] = ch[code[i]]; 55 st <<= 3LL; 56 st |= (LL) code[i]; 57 } 58 return st; 59 } 60 61 void shift(int * code) 62 { 63 for(int i = M; i; i--) code[i] = code[i-1]; 64 code[0] = 0; 65 } 66 67 void solve(int x, int y, int cur) 68 { 69 H[cur^1].init(); 70 for(int i = 1; i <= H[cur].sz; i++) 71 { 72 int code[22]; 73 decode(code, H[cur].key[i]); 74 int L = code[y-1], U = code[y]; 75 if(L && U) 76 { 77 if(L == U) 78 { 79 if(x != ex || y != ey) continue; 80 code[y-1] = code[y] = 0; 81 if(y == M) shift(code); 82 H[cur^1].push(encode(code), H[cur].val[i] + (G[2*x-1][2*y] - '0') + (G[2*x][2*y-1] - '0')); 83 } 84 else 85 { 86 code[y-1] = code[y] = 0; 87 for(int j = 0; j <= M; j++) 88 if(code[j] == U) code[j] = L; 89 if(y == M) shift(code); 90 H[cur^1].push(encode(code), H[cur].val[i] + (G[2*x-1][2*y] - '0') + (G[2*x][2*y-1] - '0')); 91 } 92 } 93 else if(L || U) 94 { 95 int t = L ? L : U, v = L ? G[2*x][2*y-1] - '0' : G[2*x-1][2*y] - '0'; 96 if(y != M) 97 { 98 code[y-1] = 0, code[y] = t; 99 H[cur^1].push(encode(code), H[cur].val[i] + v); 100 } 101 if(x != N) 102 { 103 code[y-1] = t, code[y] = 0; 104 if(y == M) shift(code); 105 H[cur^1].push(encode(code), H[cur].val[i] + v); 106 } 107 } 108 else 109 { 110 if(x == N || y == M) continue; 111 code[y-1] = code[y] = 20; 112 if(y == M) shift(code); 113 H[cur^1].push(encode(code), H[cur].val[i]); 114 } 115 } 116 return; 117 } 118 119 int main(void) 120 { 121 int T; 122 scanf("%d", &T); 123 while(T--) 124 { 125 scanf("%d %d", &N, &M); getchar(); 126 ex = N, ey = M; 127 for(int i = 1; i <= N + N + 1; i++) gets(G[i] + 1); 128 int cur = 0; 129 H[cur].init(); 130 H[cur].push(0, 0); 131 for(int i = 1; i <= N; i++) 132 for(int j = 1; j <= M; j++) 133 solve(i, j, cur), cur ^= 1; 134 int ans = 9999999; 135 for(int i = 1; i <= H[cur].sz; i++) ans = min(ans, H[cur].val[i]); 136 printf("%d ", ans); 137 } 138 return 0; 139 }
HDU 3377 Plan
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long LL; 7 int N, M, G[44][44]; 8 9 const int HASH = 10007; 10 const int STATE = 1111111; 11 struct HashMap 12 { 13 int sz, h[HASH]; 14 int nxt[STATE]; 15 int val[STATE]; 16 LL key[STATE]; 17 18 void init() 19 { 20 sz = 0; 21 memset(h, 0, sizeof(h)); 22 } 23 24 void push(LL Key, int Val) 25 { 26 int t = Key % HASH; 27 for(int i = h[t]; i; i = nxt[i]) 28 if(key[i] == Key) {val[i] = max(val[i], Val); return;} 29 nxt[++sz] = h[t]; 30 key[sz] = Key, val[sz] = Val; 31 h[t] = sz; 32 } 33 } H[2]; 34 35 void decode(int * code, LL st) 36 { 37 for(int i = M; i >= 0; i--) 38 { 39 code[i] = st & 7LL; 40 st >>= 3LL; 41 } 42 } 43 44 int ch[22]; 45 LL encode(int * code) 46 { 47 LL st = 0; 48 memset(ch, -1, sizeof(ch)); 49 int cnt = ch[0] = 0; 50 for(int i = 0; i <= M; i++) 51 { 52 if(ch[code[i]] == -1) ch[code[i]] = ++cnt; 53 code[i] = ch[code[i]]; 54 st <<= 3LL; 55 st |= (LL) code[i]; 56 } 57 return st; 58 } 59 60 void shift(int * code) 61 { 62 for(int i = M; i; i--) code[i] = code[i-1]; 63 code[0] = 0; 64 } 65 66 void solve(int x, int y, int cur) 67 { 68 H[cur^1].init(); 69 for(int i = 1; i <= H[cur].sz; i++) 70 { 71 int code[22]; 72 decode(code, H[cur].key[i]); 73 int L = code[y-1], U = code[y]; 74 if(x == 1 && y == 1) 75 { 76 if(N != 1) 77 { 78 code[y-1] = 1, code[y] = 0; 79 if(y == M) shift(code); 80 H[cur^1].push(encode(code), H[cur].val[i] + G[x][y]); 81 } 82 if(M != 1) 83 { 84 decode(code, H[cur].key[i]); 85 code[y-1] = 0, code[y] = 1; 86 if(y == M) shift(code); 87 H[cur^1].push(encode(code), H[cur].val[i] + G[x][y]); 88 } 89 } 90 else if(x == N && y == M) 91 { 92 if(L && U || !L && !U) continue; 93 code[y-1] = code[y] = 0; 94 int ok = 1; 95 for(int i = 0; i < y - 1; i++) 96 if(code[i]) ok = 0; 97 if(ok) H[cur^1].push(encode(code), H[cur].val[i] + G[x][y]); 98 } 99 else 100 { 101 if(L && U) 102 { 103 if(L == U) continue; 104 else 105 { 106 code[y-1] = code[y] = 0; 107 for(int j = 0; j <= M; j++) 108 if(code[j] == U) code[j] = L; 109 if(y == M) shift(code); 110 H[cur^1].push(encode(code), H[cur].val[i] + G[x][y]); 111 } 112 } 113 else if(L || U) 114 { 115 int t = L ? L : U; 116 if(y != M) 117 { 118 code[y-1] = 0, code[y] = t; 119 H[cur^1].push(encode(code), H[cur].val[i] + G[x][y]); 120 } 121 if(x != N) 122 { 123 code[y-1] = t, code[y] = 0; 124 if(y == M) shift(code); 125 H[cur^1].push(encode(code), H[cur].val[i] + G[x][y]); 126 } 127 } 128 else 129 { 130 code[y-1] = code[y] = 0; 131 if(y == M) shift(code); 132 H[cur^1].push(encode(code), H[cur].val[i]); 133 if(x == N || y == M) continue; 134 decode(code, H[cur].key[i]); 135 code[y-1] = code[y] = 20; 136 if(y == M) shift(code); 137 H[cur^1].push(encode(code), H[cur].val[i] + G[x][y]); 138 } 139 } 140 } 141 return; 142 } 143 144 int main(void) 145 { 146 int kase = 0; 147 while(~scanf("%d %d", &N, &M)) 148 { 149 for(int i = 1; i <= N; i++) 150 for(int j = 1; j <= M; j++) 151 scanf("%d", &G[i][j]); 152 if(N == 1 && M == 1) {printf("Case %d: %d ", ++kase, G[1][1]); continue;} 153 int cur = 0; 154 H[cur].init(); 155 H[cur].push(0, 0); 156 for(int i = 1; i <= N; i++) 157 for(int j = 1; j <= M; j++) 158 solve(i, j, cur), cur ^= 1; 159 int ans = -9999999; 160 for(int i = 1; i <= H[cur].sz; i++) 161 ans = max(ans, H[cur].val[i]); 162 printf("Case %d: %d ", ++kase, ans); 163 } 164 return 0; 165 }
1.19
POJ 1739 Tony's Tour
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long LL; 7 int N, M, G[44][44]; 8 9 const int HASH = 10007; 10 const int STATE = 1111111; 11 struct HashMap 12 { 13 int sz, h[HASH]; 14 int nxt[STATE]; 15 LL val[STATE]; 16 LL key[STATE]; 17 18 void init() 19 { 20 sz = 0; 21 memset(h, 0, sizeof(h)); 22 } 23 24 void push(LL Key, int Val) 25 { 26 int t = Key % HASH; 27 for(int i = h[t]; i; i = nxt[i]) 28 if(key[i] == Key) {val[i] += Val; return;} 29 nxt[++sz] = h[t]; 30 key[sz] = Key, val[sz] = Val; 31 h[t] = sz; 32 } 33 } H[2]; 34 35 void decode(int * code, LL st) 36 { 37 for(int i = M; i >= 0; i--) 38 { 39 code[i] = st & 7LL; 40 st >>= 3LL; 41 } 42 } 43 44 int ch[22]; 45 LL encode(int * code) 46 { 47 LL st = 0; 48 memset(ch, -1, sizeof(ch)); 49 int cnt = ch[0] = 0; 50 for(int i = 0; i <= M; i++) 51 { 52 if(ch[code[i]] == -1) ch[code[i]] = ++cnt; 53 code[i] = ch[code[i]]; 54 st <<= 3LL; 55 st |= (LL) code[i]; 56 } 57 return st; 58 } 59 60 void shift(int * code) 61 { 62 for(int i = M; i; i--) code[i] = code[i-1]; 63 code[0] = 0; 64 } 65 66 void solve(int x, int y, int cur) 67 { 68 H[cur^1].init(); 69 for(int i = 1; i <= H[cur].sz; i++) 70 { 71 int code[22]; 72 decode(code, H[cur].key[i]); 73 int L = code[y-1], U = code[y]; 74 if(!G[x][y]) 75 { 76 if(L || U) continue; 77 code[y-1] = code[y] = 0; 78 if(y == M) shift(code); 79 H[cur^1].push(encode(code), H[cur].val[i]); 80 } 81 else 82 { 83 if(x == N && y == 1) 84 { 85 if(U) 86 { 87 code[y-1] = code[y] = 0; 88 H[cur^1].push(encode(code), H[cur].val[i]); 89 } 90 else 91 { 92 code[y-1] = 0, code[y] = 20; 93 H[cur^1].push(encode(code), H[cur].val[i]); 94 } 95 } 96 else if(x == N && y == M) 97 { 98 if(L && U || !L && !U) continue; 99 code[y-1] = code[y] = 0; 100 if(y == M) shift(code); 101 H[cur^1].push(encode(code), H[cur].val[i]); 102 } 103 else 104 { 105 if(L && U) 106 { 107 if(L == U) continue; 108 else 109 { 110 code[y-1] = code[y] = 0; 111 for(int j = 0; j <= M; j++) 112 if(code[j] == U) code[j] = L; 113 if(y == M) shift(code); 114 H[cur^1].push(encode(code), H[cur].val[i]); 115 } 116 } 117 else if(L || U) 118 { 119 int t = L ? L : U; 120 if(G[x][y+1]) 121 { 122 code[y-1] = 0, code[y] = t; 123 H[cur^1].push(encode(code), H[cur].val[i]); 124 } 125 if(G[x+1][y]) 126 { 127 code[y-1] = t, code[y] = 0; 128 if(y == M) shift(code); 129 H[cur^1].push(encode(code), H[cur].val[i]); 130 } 131 } 132 else 133 { 134 if(!G[x+1][y] || !G[x][y+1]) continue; 135 decode(code, H[cur].key[i]); 136 code[y-1] = code[y] = 20; 137 if(y == M) shift(code); 138 H[cur^1].push(encode(code), H[cur].val[i]); 139 } 140 } 141 } 142 } 143 return; 144 } 145 146 int main(void) 147 { 148 while(~scanf("%d %d", &N, &M) && N) 149 { 150 memset(G, 0, sizeof(G)); 151 for(int i = 1; i <= N; i++) 152 { 153 char s[11]; 154 scanf("%s", s + 1); 155 for(int j = 1; j <= M; j++) 156 if(s[j] == '.') G[i][j] = 1; 157 } 158 if(!G[N][1] || !G[N][M]) {puts("0"); continue;} 159 if(N == 1 && M == 1) {printf("%d ", G[1][1]); continue;} 160 int cur = 0; 161 H[cur].init(); 162 H[cur].push(0, 1); 163 for(int i = 1; i <= N; i++) 164 for(int j = 1; j <= M; j++) 165 solve(i, j, cur), cur ^= 1; 166 LL ans = 0; 167 for(int i = 1; i <= H[cur].sz; i++) ans += H[cur].val[i]; 168 printf("%lld ", ans); 169 } 170 return 0; 171 }
POJ 3133 Manhattan Wiring
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long LL; 7 int N, M, G[44][44]; 8 9 const int HASH = 10007; 10 const int STATE = 1111111; 11 struct HashMap 12 { 13 int sz, h[HASH]; 14 int nxt[STATE]; 15 int val[STATE]; 16 LL key[STATE]; 17 18 void init() 19 { 20 sz = 0; 21 memset(h, 0, sizeof(h)); 22 } 23 24 void push(LL Key, int Val) 25 { 26 int t = Key % HASH; 27 for(int i = h[t]; i; i = nxt[i]) 28 if(key[i] == Key) {val[i] = min(val[i], Val); return;} 29 nxt[++sz] = h[t]; 30 key[sz] = Key, val[sz] = Val; 31 h[t] = sz; 32 } 33 } H[2]; 34 35 void decode(int * code, LL st) 36 { 37 for(int i = M; i >= 0; i--) 38 { 39 code[i] = st & 7LL; 40 st >>= 3LL; 41 } 42 } 43 44 int ch[22]; 45 LL encode(int * code) 46 { 47 LL st = 0; 48 memset(ch, -1, sizeof(ch)); 49 int cnt = ch[0] = 0; 50 for(int i = 0; i <= M; i++) 51 { 52 // if(ch[code[i]] == -1) ch[code[i]] = ++cnt; 53 // code[i] = ch[code[i]]; 54 st <<= 3LL; 55 st |= (LL) code[i]; 56 } 57 return st; 58 } 59 60 void shift(int * code) 61 { 62 for(int i = M; i; i--) code[i] = code[i-1]; 63 code[0] = 0; 64 } 65 66 void solve(int x, int y, int cur) 67 { 68 H[cur^1].init(); 69 for(int i = 1; i <= H[cur].sz; i++) 70 { 71 int code[22]; 72 decode(code, H[cur].key[i]); 73 int L = code[y-1], U = code[y]; 74 if(!G[x][y]) 75 { 76 if(L || U) continue; 77 code[y-1] = code[y] = 0; 78 if(y == M) shift(code); 79 H[cur^1].push(encode(code), H[cur].val[i]); 80 } 81 else 82 { 83 if(L && U) 84 { 85 if(L == U) 86 { 87 if(G[x][y] != 1) continue; 88 code[y-1] = code[y] = 0; 89 // for(int j = 0; j <= M; j++) 90 // if(code[j] == U) code[j] = L; 91 if(y == M) shift(code); 92 H[cur^1].push(encode(code), H[cur].val[i] + 1); 93 } 94 } 95 else if(L || U) 96 { 97 int t = L ? L : U; 98 if(G[x][y] == 1) 99 { 100 if(G[x][y+1]) 101 { 102 code[y-1] = 0, code[y] = t; 103 H[cur^1].push(encode(code), H[cur].val[i] + 1); 104 } 105 if(G[x+1][y]) 106 { 107 code[y-1] = t, code[y] = 0; 108 if(y == M) shift(code); 109 H[cur^1].push(encode(code), H[cur].val[i] + 1); 110 } 111 } 112 else if(G[x][y] == t) 113 { 114 code[y-1] = code[y] = 0; 115 if(y == M) shift(code); 116 H[cur^1].push(encode(code), H[cur].val[i] + 1); 117 } 118 } 119 else 120 { 121 if(G[x][y] == 1) 122 { 123 code[y-1] = code[y] = 0; 124 if(y == M) shift(code); 125 H[cur^1].push(encode(code), H[cur].val[i]); 126 if(!G[x+1][y] || !G[x][y+1]) continue; 127 decode(code, H[cur].key[i]); 128 code[y-1] = code[y] = 2; 129 if(y == M) shift(code); 130 H[cur^1].push(encode(code), H[cur].val[i] + 1); 131 decode(code, H[cur].key[i]); 132 code[y-1] = code[y] = 3; 133 if(y == M) shift(code); 134 H[cur^1].push(encode(code), H[cur].val[i] + 1); 135 } 136 else 137 { 138 if(G[x][y+1]) 139 { 140 code[y-1] = 0, code[y] = G[x][y]; 141 H[cur^1].push(encode(code), H[cur].val[i] + 1); 142 } 143 if(G[x+1][y]) 144 { 145 code[y-1] = G[x][y], code[y] = 0; 146 if(y == M) shift(code); 147 H[cur^1].push(encode(code), H[cur].val[i] + 1); 148 } 149 } 150 } 151 } 152 } 153 return; 154 } 155 156 int main(void) 157 { 158 while(~scanf("%d %d", &N, &M) && N) 159 { 160 memset(G, 0, sizeof(G)); 161 for(int i = 1; i <= N; i++) 162 for(int j = 1; j <= M; j++) 163 { 164 scanf("%d", &G[i][j]); 165 if(G[i][j] == 0 || G[i][j] == 1) G[i][j] ^= 1; 166 } 167 int cur = 0; 168 H[cur].init(); 169 H[cur].push(0, 0); 170 for(int i = 1; i <= N; i++) 171 for(int j = 1; j <= M; j++) 172 solve(i, j, cur), cur ^= 1; 173 int ans = 9999999; 174 for(int i = 1; i <= H[cur].sz; i++) 175 ans = min(ans, H[cur].val[i]); 176 printf("%d ", ans == 9999999 ? 0 : ans - 2); 177 } 178 return 0; 179 }
1.24
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 typedef long long LL; 7 int N, M, G[66][66]; 8 9 const int HASH = 10007; 10 const int STATE = 1111111; 11 struct HashMap 12 { 13 int sz, h[HASH]; 14 int nxt[STATE]; 15 LL key[STATE], val[STATE]; 16 17 void init() 18 { 19 sz = 0; 20 memset(h, 0, sizeof(h)); 21 } 22 23 void push(LL Key, LL Val) 24 { 25 int t = Key % HASH; 26 for(int i = h[t]; i; i = nxt[i]) 27 if(key[i] == Key) {val[i] += Val; return;} 28 nxt[++sz] = h[t]; 29 key[sz] = Key, val[sz] = Val; 30 h[t] = sz; 31 } 32 } H[2]; 33 34 void decode(int * code, LL st) 35 { 36 for(int i = N + N; i >= 0; i--) 37 { 38 code[i] = st & 1LL; 39 st >>= 1LL; 40 } 41 } 42 43 LL encode(int * code) 44 { 45 LL st = 0; 46 int cnt = 0; 47 for(int i = 0; i <= N + N; i++) 48 { 49 st <<= 1LL; 50 st |= (LL) code[i]; 51 } 52 return st; 53 } 54 55 void shift(int op, int * code) 56 { 57 if(op % 2) 58 { 59 for(int i = N + N; i > 1; i--) code[i] = code[i-2]; 60 code[0] = code[1] = 0; 61 } 62 else code[0] = code[N+N] = 0; 63 } 64 65 void solve(int x, int y, int cur) 66 { 67 H[cur^1].init(); 68 for(int i = 1; i <= H[cur].sz; i++) 69 { 70 int code[66]; 71 decode(code, H[cur].key[i]); 72 int U = code[2*x-2], L1 = code[2*x-1], L2 = code[2*x]; 73 int D = G[x+1][y], R1 = G[x+y%2-1][y+1], R2 = G[x+y%2][y+1]; 74 if(G[x][y]) 75 { 76 if(U && L1 && L2) continue; 77 if(U + L1 + L2 == 2) 78 { 79 code[2*x-2] = code[2*x-1] = code[2*x] = 0; 80 if(x == N) shift(y, code); 81 H[cur^1].push(encode(code), H[cur].val[i]); 82 } 83 else if(U || L1 || L2) 84 { 85 if(D) 86 { 87 code[2*x-2] = code[2*x-1] = 0, code[2*x] = 1; 88 H[cur^1].push(encode(code), H[cur].val[i]); 89 } 90 if(R1) 91 { 92 code[2*x-2] = 1, code[2*x-1] = code[2*x] = 0; 93 if(x == N) shift(y, code); 94 H[cur^1].push(encode(code), H[cur].val[i]); 95 } 96 if(R2) 97 { 98 decode(code, H[cur].key[i]); 99 code[2*x-2] = 0, code[2*x-1] = 1, code[2*x] = 0; 100 if(x == N) shift(y, code); 101 H[cur^1].push(encode(code), H[cur].val[i]); 102 } 103 } 104 else 105 { 106 if(D && R1) 107 { 108 code[2*x-2] = 1, code[2*x-1] = 0, code[2*x] = 1; 109 H[cur^1].push(encode(code), H[cur].val[i]); 110 } 111 if(D && R2) 112 { 113 code[2*x-2] = 0, code[2*x-1] = code[2*x] = 1; 114 H[cur^1].push(encode(code), H[cur].val[i]); 115 } 116 if(R1 && R2) 117 { 118 code[2*x-2] = code[2*x-1] = 1, code[2*x] = 0; 119 if(x == N) shift(y, code); 120 H[cur^1].push(encode(code), H[cur].val[i]); 121 } 122 } 123 } 124 else 125 { 126 if(U || L1 || L2) continue; 127 if(x == N) shift(y, code); 128 H[cur^1].push(encode(code), H[cur].val[i]); 129 } 130 } 131 return; 132 } 133 134 int main(void) 135 { 136 while(~scanf("%d %d", &N, &M)) 137 { 138 memset(G, 0, sizeof(G)); 139 for(int i = 1; i <= N; i++) 140 for(int j = 1; j <= 8; j++) 141 G[i][j] = 1; 142 for(int i = 1; i <= M; i++) 143 { 144 char s[22]; 145 scanf("%s", s + 1); 146 G[s[1]-'A'+1][s[2]-'A'+1] = 0; 147 } 148 int cur = 0; 149 H[cur].init(); 150 H[cur].push(0, 1); 151 for(int j = 1; j <= 8; j++) 152 for(int i = 1; i <= N; i++) 153 solve(i, j, cur), cur ^= 1; 154 LL ans = 0; 155 for(int i = 1; i <= H[cur].sz; i++) ans += H[cur].val[i]; 156 printf("%lld ", ans); 157 } 158 return 0; 159 }
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 using namespace std; 5 typedef long long LL; 6 const int mod = 7777777; 7 int N, M; 8 9 const int maxn = 120; 10 struct Matrix 11 { 12 int m[maxn][maxn]; 13 Matrix(){memset(m, 0, sizeof(m));} 14 void E(){memset(m, 0, sizeof(m)); for(int i = 0; i < maxn; i++) m[i][i] = 1;} 15 } G; 16 17 Matrix M_mul(Matrix a, Matrix b) 18 { 19 Matrix ret; 20 for(int i = 0; i < maxn; i++) 21 for(int j = 0; j < maxn; j++) 22 for(int k = 0; k < maxn; k++) 23 ret.m[i][j] = ( ret.m[i][j] + ((LL) a.m[i][k] * b.m[k][j]) % mod ) % mod; 24 return ret; 25 } 26 27 Matrix M_qpow(Matrix P, LL n) 28 { 29 Matrix ret; 30 ret.E(); 31 while(n) 32 { 33 if(n & 1LL) ret = M_mul(ret, P); 34 n >>= 1LL; 35 P = M_mul(P, P); 36 } 37 return ret; 38 } 39 40 const int HASH = 10007; 41 const int STATE = 1111111; 42 struct HashMap 43 { 44 int sz, h[HASH]; 45 int nxt[STATE]; 46 int key[STATE]; 47 48 void init() 49 { 50 sz = 0; 51 memset(h, 0, sizeof(h)); 52 } 53 54 int push(int Key) 55 { 56 int t = Key % HASH; 57 for(int i = h[t]; i; i = nxt[i]) 58 if(key[i] == Key) return i; 59 nxt[++sz] = h[t]; 60 key[sz] = Key; 61 h[t] = sz; 62 return sz; 63 } 64 } H; 65 66 void decode(int * code, LL st) 67 { 68 for(int i = N - 1; i >= 0; i--) 69 { 70 code[i] = st & 3LL; 71 st >>= 2LL; 72 } 73 } 74 75 int ch[44]; 76 LL encode(int * code) 77 { 78 LL st = 0; 79 memset(ch, -1, sizeof(ch)); 80 int cnt = ch[0] = 0; 81 for(int i = 0; i < N; i++) 82 { 83 if(ch[code[i]] == -1) ch[code[i]] = ++cnt; 84 code[i] = ch[code[i]]; 85 st <<= 2LL; 86 st |= (LL) code[i]; 87 } 88 return st; 89 } 90 91 int main(void) 92 { 93 while(~scanf("%d %d", &N, &M)) 94 { 95 H.init(); 96 H.push(0); 97 int code[22] = {0}; 98 code[0] = code[N-1] = 1; 99 H.push(encode(code)); 100 G = Matrix(); 101 for(int i = 2; i <= H.sz; i++) 102 for(int j = 0; j < (1 << N); j++) 103 { 104 decode(code, H.key[i]); 105 int ok = 1, up = 0; 106 for(int k = 0; k < N; k++) 107 { 108 if((1 << k) & j) 109 { 110 if(up && code[k]) {ok = 0; break;} 111 else if(up) code[k] = up, up = 0; 112 else if(!up && !code[k]) code[k] = up = 20 + k; 113 } 114 else 115 { 116 if(!up && !code[k]) {ok = 0; break;} 117 else if(up && code[k]) 118 { 119 if(up == code[k] && (j || k != N - 1)) {ok = 0; break;} 120 for(int p = 0; p < N; p++) 121 if(code[p] == up) code[p] = code[k]; 122 code[k] = up = 0; 123 } 124 else if(code[k]) up = code[k], code[k] = 0; 125 } 126 } 127 if(up) ok = 0; 128 if(!ok) continue; 129 int ii = H.push(encode(code)); 130 G.m[i][ii] = 1; 131 } 132 G = M_qpow(G, M); 133 if(!G.m[2][1]) puts("Impossible"); 134 else printf("%d ", G.m[2][1]); 135 } 136 return 0; 137 }
2.13
主席树
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cstring> 5 using namespace std; 6 const int maxn = 2e5 + 10; 7 8 int cnt; 9 int a[maxn]; 10 int rt[maxn]; 11 12 struct node 13 { 14 int sum; 15 int ls, rs; 16 } nod[maxn * 40]; 17 18 void update(int l, int r, int &x, int y, int pos, int v) 19 { 20 nod[++cnt] = nod[y]; nod[cnt].sum += v; x = cnt; 21 if(l == r) return; 22 int mid = (l + r) >> 1; 23 if(pos <= mid) update(l, mid, nod[x].ls, nod[y].ls, pos, v); 24 else update(mid + 1, r, nod[x].rs, nod[y].rs, pos, v); 25 } 26 27 int query(int p, int tl, int tr, int l, int r) 28 { 29 if(tr < l || r < tl) return 0; 30 if(l <= tl && tr <= r) return nod[p].sum; 31 int mid = (tl + tr) >> 1; 32 int ret = query(nod[p].ls, tl, mid, l, r); 33 ret += query(nod[p].rs, mid + 1, tr, l, r); 34 return ret; 35 } 36 37 int query(int p, int tl, int tr, int k) 38 { 39 if(tl == tr) return tl; 40 int mid = (tl + tr) >> 1; 41 if(nod[nod[p].ls].sum < k) return query(nod[p].rs, mid + 1, tr, k - nod[nod[p].ls].sum); 42 return query(nod[p].ls, tl, mid, k); 43 } 44 45 int pre[maxn]; 46 int main(void) 47 { 48 int T; 49 scanf("%d", &T); 50 for(int kase = 1; kase <= T; kase++) 51 { 52 int n, m; 53 scanf("%d %d", &n, &m); 54 for(int i = 1; i <= n; i++) scanf("%d", a + i); 55 cnt = 0; 56 memset(pre, 0, sizeof(pre)); 57 rt[n+1] = 0; 58 for(int i = n; i; i--) 59 { 60 update(1, n, rt[i], rt[i+1], i, 1); 61 if(pre[a[i]]) update(1, n, rt[i], rt[i], pre[a[i]], -1); 62 pre[a[i]] = i; 63 } 64 int ans = 0; 65 printf("Case #%d:", kase); 66 while(m--) 67 { 68 int l_, r_, l, r; 69 scanf("%d %d", &l_, &r_); 70 l = min((l_ + ans) % n + 1, (r_ + ans) % n + 1); 71 r = max((l_ + ans) % n + 1, (r_ + ans) % n + 1); 72 int k = (query(rt[l], 1, n, l, r) + 1) / 2; 73 ans = query(rt[l], 1, n, k); 74 printf(" %d", ans); 75 } 76 puts(""); 77 } 78 return 0; 79 }
2.22
斜率dp
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int maxn = 5e5 + 10; 5 int sum[maxn], st[maxn], dp[maxn]; 6 7 8 int main(void) 9 { 10 int n, m; 11 while(~scanf("%d %d", &n, &m)) 12 { 13 for(int i = 1; i <= n; i++) scanf("%d", sum + i); 14 for(int i = 1; i <= n; i++) sum[i] += sum[i-1]; 15 int p1 = 1, p2 = 1; 16 st[p1] = 0; 17 for(int i = 1; i <= n; i++) 18 { 19 while(p2 < p1 && (dp[st[p2+1]] + sum[st[p2+1]] * sum[st[p2+1]]) - (dp[st[p2]] + sum[st[p2]] * sum[st[p2]]) <= 2 * sum[i] * (sum[st[p2+1]] - sum[st[p2]])) p2++; 20 dp[i] = dp[st[p2]] + (sum[i] - sum[st[p2]]) * (sum[i] - sum[st[p2]]) + m; 21 while(p2 < p1 && ((dp[i] + sum[i] * sum[i]) - (dp[st[p1]] + sum[st[p1]] * sum[st[p1]])) * (sum[st[p1]] - sum[st[p1-1]]) <= ((dp[st[p1]] + sum[st[p1]] * sum[st[p1]]) - (dp[st[p1-1]] + sum[st[p1-1]] * sum[st[p1-1]])) * (sum[i] - sum[st[p1]])) p1--; 22 st[++p1] = i; 23 } 24 printf("%d ", dp[n]); 25 } 26 return 0; 27 }
2.23
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 int a[10010], dp[5005][10010], st[10010]; 6 7 int main(void) 8 { 9 int T; 10 scanf("%d", &T); 11 for(int kase = 1; kase <= T; kase++) 12 { 13 int n, m; 14 scanf("%d %d", &n, &m); 15 for(int i = 1; i <= n; i++) scanf("%d", a + i); 16 sort(a + 1, a + n + 1); 17 for(int i = 1; i <= n; i++) dp[1][i] = (a[i] - a[1]) * (a[i] - a[1]); 18 for(int i = 2; i <= m; i++) 19 { 20 int p1 = 1, p2 = 1; 21 st[p1] = 0; 22 for(int j = 1; j <= n; j++) 23 { 24 while(p1 > p2 && dp[i-1][st[p2+1]] + a[st[p2+1]+1] * a[st[p2+1]+1] - dp[i-1][st[p2]] - a[st[p2]+1] * a[st[p2]+1] <= 2 * a[j] * (a[st[p2+1]+1] - a[st[p2]+1])) p2++; 25 dp[i][j] = dp[i-1][st[p2]] + (a[st[p2]+1] - a[j]) * (a[st[p2]+1] - a[j]); 26 while(p1 > p2 && (dp[i-1][j] + a[j+1] * a[j+1] - dp[i-1][st[p1]] - a[st[p1]+1] * a[st[p1]+1]) * (a[st[p1]+1] - a[st[p1-1]+1]) <= (dp[i-1][st[p1]] + a[st[p1]+1] * a[st[p1]+1] - dp[i-1][st[p1-1]] - a[st[p1-1]+1] * a[st[p1-1]+1]) * (a[j+1] - a[st[p1]+1])) p1--; 27 st[++p1] = j; 28 } 29 } 30 printf("Case %d: %d ", kase, dp[m][n]); 31 } 32 return 0; 33 }
2.24
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 typedef long long LL; 5 LL s[1111], s2[1111], dp[1111][1111]; 6 int a[1111], st[1111]; 7 8 int main(void) 9 { 10 int n, m; 11 while(~scanf("%d %d", &n, &m) && n) 12 { 13 for(int i = 1; i <= n; i++) scanf("%d", a + i), s[i] = s[i-1] + a[i], s2[i] = s2[i-1] + a[i] * a[i]; 14 for(int i = 1; i <= n; i++) dp[0][i] = (s[i] * s[i] - s2[i]) / 2; 15 for(int i = 1; i <= m; i++) 16 { 17 int p1 = 1, p2 = 1; 18 st[1] = 0; 19 for(int j = 1; j <= n; j++) 20 { 21 while(p1 > p2 && 2 * dp[i-1][st[p2+1]] + s[st[p2+1]] * s[st[p2+1]] + s2[st[p2+1]] - 2 * dp[i-1][st[p2]] - s[st[p2]] * s[st[p2]] - s2[st[p2]] <= 2 * s[j] * (s[st[p2+1]] - s[st[p2]])) p2++; 22 dp[i][j] = dp[i-1][st[p2]] + ((s[j] - s[st[p2]]) * (s[j] - s[st[p2]]) - s2[j] + s2[st[p2]]) / 2; 23 while(p1 > p2 && (2 * dp[i-1][j] + s[j] * s[j] + s2[j] - 2 * dp[i-1][st[p1]] - s[st[p1]] * s[st[p1]] - s2[st[p1]]) * (s[st[p1]] - s[st[p1-1]]) <= (2 * dp[i-1][st[p1]] + s[st[p1]] * s[st[p1]] + s2[st[p1]] - 2 * dp[i-1][st[p1-1]] - s[st[p1-1]] * s[st[p1-1]] - s2[st[p1-1]]) * (s[j] - s[st[p1]])) p1--; 24 st[++p1] = j; 25 } 26 } 27 printf("%I64d ", dp[m][n]); 28 } 29 return 0; 30 }