放假之前

咸鱼好久啦。快放假了调整下。

圣诞打到了小礼物自己动手丰衣足食(其实是没人给我送)

12.24

URAL 1519 Formula 1

插头dp。抄板子。

  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 int G[22][22];
  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     LL key[STATE], val[STATE];
 17 
 18     void init()
 19     {
 20         sz = 0;
 21         memset(h, 0, sizeof(h));
 22     }
 23 
 24     void push(LL Key, LL 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         if(G[x][y])
 74         {
 75             int L = code[y-1], U = code[y];
 76             if(L && U)
 77             {
 78                 if(L == U)
 79                 {
 80                     if(x != ex || y != ey) continue;
 81                     code[y-1] = code[y] = 0;
 82                 }
 83                 else
 84                 {
 85                     code[y-1] = code[y] = 0;
 86                     for(int j = 0; j <= M; j++)
 87                     if(code[j] == U) code[j] = L;
 88                 }
 89             }
 90             else if(L || U)
 91             {
 92                 int t = L ? L : U;
 93                 if(G[x][y+1])
 94                 {
 95                     code[y-1] = 0, code[y] = t;
 96                     H[cur^1].push(encode(code), H[cur].val[i]);
 97                 }
 98                 if(G[x+1][y])
 99                 {
100                     code[y-1] = t, code[y] = 0;
101                     if(y == M) shift(code);
102                     H[cur^1].push(encode(code), H[cur].val[i]);
103                 }
104                 continue;
105             }
106             else
107             {
108                 if(!G[x][y+1] || !G[x+1][y]) continue;
109                 code[y-1] = code[y] = 20;
110             }
111         }
112         else code[y-1] = code[y] = 0;
113         if(y == M) shift(code);
114         H[cur^1].push(encode(code), H[cur].val[i]);
115     }
116     return;
117 }
118 
119 int main(void)
120 {
121     ex = ey = 0;
122     scanf("%d %d", &N, &M);
123     for(int i = 1; i <= N; i++)
124     {
125         char s[22];
126         scanf("%s", s + 1);
127         for(int j = 1; j <= M; j++)
128         if(s[j] == '.') G[i][j] = 1, ex = i, ey = j;
129     }
130     if(!ex && !ey) puts("0");
131     else
132     {
133 
134     int cur = 0;
135     H[cur].init();
136     H[cur].push(0, 1);
137     for(int i = 1; i <= N; i++)
138         for(int j = 1; j <= M; j++)
139             solve(i, j, cur), cur ^= 1;
140     LL ans = 0;
141     for(int i = 1; i <= H[cur].sz; i++) ans += H[cur].val[i];
142     printf("%I64d\n", ans);
143     }
144     return 0;
145 }
Aguin

12.25

HDU 1693 Eat the Trees

简化版。改改板子。

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 using namespace std;
  6 typedef long long LL;
  7 int G[22][22];
  8 int N, M;
  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     LL key[STATE], val[STATE];
 17 
 18     void init()
 19     {
 20         sz = 0;
 21         memset(h, 0, sizeof(h));
 22     }
 23 
 24     void push(LL Key, LL 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         if(G[x][y])
 74         {
 75             int L = code[y-1], U = code[y];
 76             if(L && U)
 77             {
 78                 if(L == U)
 79                 {
 80                     // if(x != ex || y != ey) continue;
 81                     code[y-1] = code[y] = 0;
 82                 }
 83                 else
 84                 {
 85                     code[y-1] = code[y] = 0;
 86                     for(int j = 0; j <= M; j++)
 87                     if(code[j] == U) code[j] = L;
 88                 }
 89             }
 90             else if(L || U)
 91             {
 92                 int t = L ? L : U;
 93                 if(G[x][y+1])
 94                 {
 95                     code[y-1] = 0, code[y] = t;
 96                     H[cur^1].push(encode(code), H[cur].val[i]);
 97                 }
 98                 if(G[x+1][y])
 99                 {
100                     code[y-1] = t, code[y] = 0;
101                     if(y == M) shift(code);
102                     H[cur^1].push(encode(code), H[cur].val[i]);
103                 }
104                 continue;
105             }
106             else
107             {
108                 if(!G[x][y+1] || !G[x+1][y]) continue;
109                 code[y-1] = code[y] = 20;
110             }
111         }
112         else code[y-1] = code[y] = 0;
113         if(y == M) shift(code);
114         H[cur^1].push(encode(code), H[cur].val[i]);
115     }
116     return;
117 }
118 
119 int main(void)
120 {
121     int T;
122     scanf("%d", &T);
123     for(int kase = 1; kase <= T; kase++)
124     {
125         memset(G, 0, sizeof(G));
126         scanf("%d %d", &N, &M);
127         for(int i = 1; i <= N; i++)
128             for(int j = 1; j <= M; j++)
129                 scanf("%d", &G[i][j]);
130         int cur = 0;
131         H[cur].init();
132         H[cur].push(0, 1);
133         for(int i = 1; i <= N; i++)
134             for(int j = 1; j <= M; j++)
135                 solve(i, j, cur), cur ^= 1;
136         LL ans = 0;
137         for(int i = 1; i <= H[cur].sz; i++) ans += H[cur].val[i];
138         printf("Case %d: There are %I64d ways to eat the trees.\n", kase, ans);
139     }
140     return 0;
141 }
Aguin

 

posted @ 2016-12-25 22:35  Aguin  阅读(237)  评论(0编辑  收藏  举报