• 放假之前


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

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

    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
    ", 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.
    ", kase, ans);
    139     }
    140     return 0;
    141 }
    Aguin
  • 相关阅读:
    [POJ 2096]Collecting Bugs
    [SPOJ 375]Query on a tree
    [BZOJ 4423][AMPPZ2013]Bytehattan
    [BZOJ 2038][2009国家集训队]小Z的袜子(hose)
    [SDOI 2017]数字表格
    [NOI 2010]能量采集
    [HNOI 2014]世界树
    [HNOI 2016]序列
    [HNOI 2016]大数
    [HEOI 2014]大工程
  • 原文地址:https://www.cnblogs.com/Aguin/p/6220802.html
Copyright © 2020-2023  润新知