zoukankan      html  css  js  c++  java
  • 第二周 7.17-7.23

    7.17

    HDU 5456 Matches Puzzle Game

    没有最丑只有更丑。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 using namespace std;
     6 typedef long long LL;
     7 int num[] = { 6, 2, 5, 5, 4, 5, 6, 3, 7, 6 };
     8 LL dp[555][2][2][2][2];
     9 
    10 int main(void)
    11 {
    12     int T;
    13     scanf("%d", &T);
    14     for(int kase = 1; kase <= T; kase++)
    15     {
    16         LL n, m;
    17         scanf("%I64d %I64d", &n, &m);
    18         memset(dp, 0, sizeof(dp));
    19         dp[n-3][0][0][0][0] = 1;
    20         for(int i = n - 3; i > 0; i--)
    21         {
    22             for(int p1 = 0; p1 <= 1; p1++)
    23             for(int p2 = 0; p2 <= 1; p2++)
    24             for(int p3 = 0; p3 <= 1; p3++)
    25             for(int k = 0; k <= 1; k++)
    26             for(int a = 0; a <= 9; a++)
    27             for(int b = 0; b <= 9; b++)
    28             {
    29                 if(p1 || p2 && b) continue;
    30 
    31                 int c = a - k - b, nk = 0;
    32                 if(c < 0) c += 10, nk = 1;
    33                 if(p3 && c) continue;
    34 
    35                 int tot = num[a];
    36                 if(!p2) tot += num[b];
    37                 if(!p3) tot += num[c];
    38                 if(tot > i) continue;
    39 
    40                 for(int pp1 = 0; pp1 <= 1; pp1++)
    41                 for(int pp2 = 0; pp2 <= 1; pp2++)
    42                 for(int pp3 = 0; pp3 <= 1; pp3++)
    43                 {
    44                     if(p1 && !pp1) continue;
    45                     if(p2 && !pp2) continue;
    46                     if(p3 && !pp3) continue;
    47                     if(pp1 && !(a && !nk)) continue;
    48                     if(!p2 && pp2 && !b) continue;
    49                     if(!p3 && pp3 && !c) continue;
    50                     if(pp1 && !pp2) continue;
    51                     if(pp1 && !pp3) continue;
    52                     dp[i-tot][pp1][pp2][pp3][nk] = (dp[i-tot][pp1][pp2][pp3][nk] + dp[i][p1][p2][p3][k]) % m;
    53                 }
    54             }
    55         }
    56 
    57         printf("Case #%d: %I64d
    ", kase, dp[0][1][1][1][0]);
    58 
    59     }
    60     return 0;
    61 }
    Aguin

    7.18

    HDU 5489 Removed Interval

    一个BIT可以用三遍西西西

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <map>
     6 #include <vector>
     7 using namespace std;
     8 const int maxn = 1e5 + 10;
     9 int f[maxn], g[maxn], dp[maxn];
    10 
    11 // BIT
    12 int c[maxn];
    13 int lowbit(int s)
    14 {
    15     return s & (-s);
    16 }
    17 void modify(int i, int x)
    18 {
    19     while(i < maxn) c[i] = max(c[i], x), i += lowbit(i);
    20     return;
    21 }
    22 int query(int i)
    23 {
    24     int ret = 0;
    25     while(i > 0) ret = max(ret, c[i]), i -= lowbit(i);
    26     return ret;
    27 }
    28 
    29 struct node
    30 {
    31     int a, pos;
    32 }p[maxn];
    33 bool cmp(node A, node B)
    34 {
    35     if(A.a != B.a) return A.a < B.a;
    36     return A.pos > B.pos;
    37 }
    38 
    39 int main(void)
    40 {
    41     int T;
    42     scanf("%d", &T);
    43     for(int kase = 1; kase <= T; kase++)
    44     {
    45         int N, L;
    46         scanf("%d %d", &N, &L);
    47         for(int i = 1; i <= N; i++)
    48         {
    49             scanf("%d", &p[i].a);
    50             p[i].pos = i;
    51         }
    52 
    53         memset(c, 0, sizeof(c));
    54         sort(p + 1, p + N + 1, cmp);
    55         for(int i = 1; i <= N; i++)
    56         {
    57             int pos = p[i].pos;
    58             f[pos] = query(pos) + 1;
    59             modify(pos, f[pos]);
    60         }
    61 
    62         memset(c, 0, sizeof(c));
    63         for(int i = N; i; i--)
    64         {
    65             int pos = p[i].pos;
    66             g[pos] = query(N - pos + 1) + 1;
    67             modify(N - pos + 1, g[pos]);
    68         }
    69 
    70         int ans = 0;
    71         memset(c, 0, sizeof(c));
    72         for(int i = N; i; i--)
    73         {
    74             int pos = p[i].pos;
    75             if(N - pos - L >= 0) ans = max(ans, query(N - pos - L) + f[pos]);
    76             modify(N - pos + 1, g[pos]);
    77         }
    78         ans = max(ans, query(N - L));
    79         printf("Case #%d: %d
    ", kase, ans);
    80 
    81     }
    82     return 0;
    83 }
    Aguin

    HDU 5517 Triple

    好久不见二维树状数组哦。

    现已加入豪华午餐。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 #include <algorithm>
     5 #include <map>
     6 using namespace std;
     7 typedef long long LL;
     8 typedef pair<int, int> pii;
     9 typedef pair<int, pii> piii;
    10 int ma[111111], cb[111111];
    11 map<piii, LL> M;
    12 map<piii, LL>::reverse_iterator it;
    13 
    14 // 2D - BIT
    15 const int maxn = 1e3 + 10;
    16 int c[maxn][maxn];
    17 int lowbit(int s)
    18 {
    19     return s & (-s);
    20 }
    21 void modify(int x, int y, int v)
    22 {
    23     for(int i = x; i < maxn; i += lowbit(i))
    24         for(int j = y; j < maxn; j += lowbit(j))
    25             c[i][j] += v;
    26     return;
    27 }
    28 int query(int x, int y)
    29 {
    30     int ret = 0;
    31     for(int i = x; i > 0; i -= lowbit(i))
    32         for(int j = y; j > 0; j -= lowbit(j))
    33             ret += c[i][j];
    34     return ret;
    35 }
    36 
    37 int main(void)
    38 {
    39     int t;
    40     scanf("%d", &t);
    41     for(int kase = 1; kase <= t; kase++)
    42     {
    43 
    44         int n, m;
    45         scanf("%d %d", &n, &m);
    46 
    47         memset(cb, 0, sizeof(cb));
    48         memset(ma, 0, sizeof(ma));
    49         for(int i = 1; i <= n; i++)
    50         {
    51             int a, b;
    52             scanf("%d %d", &a, &b);
    53             if(a == ma[b]) cb[b]++;
    54             if(a > ma[b]) ma[b] = a, cb[b] = 1;
    55         }
    56 
    57         M.clear();
    58         for(int i = 1; i <= m; i++)
    59         {
    60             int c, d, e;
    61             scanf("%d %d %d", &c, &d, &e);
    62             if(cb[e])
    63             {
    64                 piii tmp = piii(ma[e], pii(c, d));
    65                 M[tmp] = M[tmp] + cb[e];
    66             }
    67         }
    68 
    69         LL ans = 0;
    70         memset(c, 0, sizeof(c));
    71         for(it = M.rbegin(); it != M.rend(); it++)
    72         {
    73             LL cnt = (*it).second;
    74             pii tmp = (*it).first.second;
    75             int c = tmp.first, d = tmp.second;
    76             if(!query(1001 - c, 1001 - d)) ans = ans + cnt;
    77             modify(1001 - c, 1001 - d, 1);
    78         }
    79 
    80         printf("Case #%d: %I64d
    ", kase, ans);
    81 
    82     }
    83     return 0;
    84 }
    Aguin

    昨天BC2周年没打。补个题。

    1004平面最近点对没做过。顺便A了个板子题。

    HDU 1007 Quoit Design

    #include <iostream>
    #include <cstdio>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    using namespace std;
    const int maxn = 1e5 + 10;
    const double INF = 1e18;
    
    struct point
    {
        double x, y;
    } p[maxn];
    
    bool cmpx(point A, point B)
    {
        return A.x < B.x;
    }
    
    bool cmpy(point A, point B)
    {
        return A.y < B.y;
    }
    
    double dis(point A, point B)
    {
        return sqrt((A.x - B.x) * (A.x - B.x) +(A.y - B.y) * (A.y - B.y));
    }
    
    double cal(int l, int r)
    {
        double d = INF;
        if(l == r) return d;
        if(l + 1 == r) return dis(p[l], p[r]);
    
        int mid = (l + r) >> 1;
        double d1 = cal(l, mid), d2 = cal(mid + 1, r);
        d = min(d1, d2);
    
        vector<point> v;
        for(int i = l; i <= r; i++)
            if(abs(p[mid].x - p[i].x) < d)
                v.push_back(p[i]);
        sort(v.begin(), v.end(), cmpy);
    
        int sz = v.size();
        for(int i = 0; i < sz; i++)
        {
            for(int j = i + 1; j < sz; j++)
            {
                if(v[j].y - v[i].y >= d) break;
                d = min(d, dis(v[i], v[j]));
            }
        }
    
        return d;
    }
    
    int main(void)
    {
        int N;
        while(~scanf("%d", &N) && N)
        {
            for(int i = 1; i <= N; i++) scanf("%lf %lf", &p[i].x, &p[i].y);
            sort(p + 1, p + 1 + N, cmpx);
            printf("%.2f
    ", cal(1, N) / 2);
        }
        return 0;
    }
    Aguin

    HDU 5718 Oracle

    最近比较背。于是简单题也写了。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <cstring>
     4 using namespace std;
     5 const int maxn = 1e7 + 10;
     6 char s[maxn];
     7 int cnt[10];
     8 
     9 int main(void)
    10 {
    11     int T;
    12     scanf("%d", &T);
    13     while(T--)
    14     {
    15         scanf("%s", s);
    16         int l = strlen(s);
    17 
    18         memset(cnt, 0, sizeof(cnt));
    19         for(int i = 0; i < l; i++) cnt[s[i]-'0']++;
    20 
    21         int c = 0;
    22         for(int i = 1; i <= 9; i++) c += cnt[i];
    23         if(c < 2) {puts("Uncertain"); continue;}
    24 
    25         int p = 0;
    26         for(int i = 1; i <= 9; i++)
    27         if(cnt[i]) {cnt[i]--, p = i; break;}
    28 
    29         int pos = 0;
    30         for(int i = 0; i <= 9; i++)
    31             while(cnt[i]--) s[pos++] = i + '0';
    32         s[pos] = '0';
    33 
    34         s[0] += p;
    35         for(int i = 0; i < pos; i++)
    36             if(s[i] > '9') s[i] -= 10, s[i+1]++;
    37 
    38         if(s[pos] != '0') pos++;
    39 
    40         for(int i = pos - 1; i >= 0; i--) printf("%c", s[i]);
    41         puts("");
    42 
    43     }
    44 
    45     return 0;
    46 }
    Aguin

    HDU 5719 Arrange

    无解情况比较多。

     1 #include <iostream>
     2 #include <cstdio>
     3 using namespace std;
     4 typedef long long LL;
     5 const LL mod = 998244353;
     6 const int maxn = 1e5 + 10;
     7 int B[maxn], C[maxn];
     8 
     9 int main(void)
    10 {
    11     int T;
    12     scanf("%d", &T);
    13     while(T--)
    14     {
    15         int n;
    16         scanf("%d", &n);
    17         for(int i = 1; i <= n; i++) scanf("%d", B + i);
    18         for(int i = 1; i <= n; i++) scanf("%d", C + i);
    19 
    20         LL ans = 1;
    21         if(B[1] != C[1]) ans = 0;
    22         for(int i = 2; i <= n; i++)
    23         {
    24             if(B[i] > B[i-1]) ans = 0;
    25             if(C[i] < C[i-1]) ans = 0;
    26             if(B[i] != B[i-1] && C[i] != C[i-1]) ans = 0;
    27         }
    28 
    29         for(int i = 2; i <= n; i++)
    30         {
    31             if(B[i] != B[i-1] || C[i] != C[i-1]) continue;
    32             LL tmp = C[i] - B[i] - i + 2;
    33             if(tmp <= 0) ans = 0;
    34             else ans = ans * tmp % mod;
    35         }
    36 
    37         printf("%I64d
    ", ans);
    38 
    39     }
    40 
    41     return 0;
    42 }
    Aguin

    HDU 5720 Wool

    喜欢无脑丢set。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <set>
     5 using namespace std;
     6 typedef long long LL;
     7 typedef pair<LL, LL> pii;
     8 const int maxn = 1e5 + 10;
     9 LL a[maxn];
    10 set<pii> S;
    11 set<pii>::iterator it;
    12 
    13 int main(void)
    14 {
    15     int T;
    16     scanf("%d", &T);
    17     while(T--)
    18     {
    19         S.clear();
    20         int n;
    21         LL L, R;
    22         scanf("%d %I64d %I64d", &n, &L, &R);
    23         for(int i = 1; i <= n; i++) scanf("%I64d", a + i);
    24         sort(a + 1, a + 1 + n);
    25         for(int i = 2; i <= n; i++)
    26         {
    27             if(a[i] - a[i-1] + 1 > R || a[i] + a[i-1] - 1 < L) continue;
    28             LL l = max(L, a[i] - a[i-1] + 1), r = min(R, a[i] + a[i-1] - 1);
    29             S.insert(pii(l, r));
    30         }
    31 
    32         LL ans = R - L + 1, tmp = 0;
    33         for(it = S.begin(); it != S.end(); it++)
    34         {
    35             LL l = (*it).first, r = (*it).second;
    36             if(r <= tmp) continue;
    37             if(l <= tmp) ans -= r - tmp;
    38             else ans -= r - l + 1;
    39             tmp = r;
    40         }
    41 
    42         printf("%I64d
    ", ans);
    43 
    44     }
    45     return 0;
    46 }
    Aguin

    HDU 5721 Palace

    删点就换了个无穷远点。

     1 #include <iostream>
     2 #include <cstdio>
     3 #include <algorithm>
     4 #include <vector>
     5 using namespace std;
     6 typedef long long LL;
     7 const int maxn = 1e5 + 10;
     8 const LL INF = 1e18;
     9 
    10 struct point
    11 {
    12     int id;
    13     LL x, y;
    14 } p[maxn];
    15 
    16 bool cmpx(point A, point B)
    17 {
    18     return A.x < B.x;
    19 }
    20 
    21 bool cmpy(point A, point B)
    22 {
    23     return A.y < B.y;
    24 }
    25 
    26 LL dis(point A, point B)
    27 {
    28     return (A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y);
    29 }
    30 
    31 LL m;
    32 point p1, p2;
    33 LL cal(int l, int r)
    34 {
    35     LL d = INF;
    36     if(l == r) return d;
    37     if(l + 1 == r)
    38     {
    39         d = dis(p[l], p[r]);
    40         if(d < m) p1 = p[l], p2 = p[r], m = d;
    41         return d;
    42     }
    43 
    44     int mid = (l + r) >> 1;
    45     LL d1 = cal(l, mid), d2 = cal(mid + 1, r);
    46     d = min(d1, d2);
    47 
    48     vector<point> v;
    49     for(int i = l; i <= r; i++)
    50         if((p[mid].x - p[i].x) * (p[mid].x - p[i].x) < d)
    51             v.push_back(p[i]);
    52     sort(v.begin(), v.end(), cmpy);
    53 
    54     int sz = v.size();
    55     for(int i = 0; i < sz; i++)
    56     {
    57         for(int j = i + 1; j < sz; j++)
    58         {
    59             if((v[j].y - v[i].y) * (v[j].y - v[i].y) >= d) break;
    60             d = min(d, dis(v[i], v[j]));
    61             if(d < m) m = d, p1 = v[i], p2 = v[j];
    62         }
    63     }
    64 
    65     return d;
    66 }
    67 
    68 int main(void)
    69 {
    70     int T;
    71     scanf("%d", &T);
    72     while(T--)
    73     {
    74         int N;
    75         scanf("%d", &N);
    76         for(int i = 1; i <= N; i++) scanf("%I64d %I64d", &p[i].x, &p[i].y);
    77         sort(p + 1, p + 1 + N, cmpx);
    78         for(int i = 1; i <= N; i++) p[i].id = i;
    79 
    80         m = INF;
    81         LL ans = cal(1, N) * (N - 2);
    82         point M;
    83         M.x = M.y = 1e8;
    84         int a = p1.id, b = p2.id;
    85         swap(M, p[a]);
    86         ans = ans + cal(1, N);
    87         swap(M, p[a]);
    88         swap(M, p[b]);
    89         ans = ans + cal(1, N);
    90 
    91         printf("%I64d
    ", ans);
    92 
    93     }
    94     return 0;
    95 }
    Aguin

    HDU 5722 Jewelry

    想了半天整数扫描线怎么搞……其实浮点数的板,右端点+1就可以了。

      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <map>
      5 #include <vector>
      6 #include <algorithm>
      7 using namespace std;
      8 typedef long long LL;
      9 const int maxn = 1e5 + 10;
     10 map< int, vector<int> > M;
     11 map< int, vector<int> >::iterator it;
     12 
     13 // segment_tree
     14 int a[maxn<<1];
     15 int cnt[maxn<<3], sum[maxn<<3];
     16 struct seg
     17 {
     18     int l, r, h, f;
     19     seg(){}
     20     seg(int L, int R, int H, int F): l(L), r(R), h(H), f(F){}
     21 }S[maxn<<1];
     22 bool cmp(seg A, seg B)
     23 {
     24     return A.h < B.h;
     25 }
     26 void gather(int p, int tl, int tr)
     27 {
     28     if(cnt[p]) sum[p] = a[tr] - a[tl-1];
     29     else if(tl == tr) sum[p] = 0;
     30     else sum[p] = sum[p<<1] + sum[p<<1|1];
     31 }
     32 void modify(int p, int tl, int tr, int l, int r, int v)
     33 {
     34     if(tr < l || r < tl) return;
     35     if(l <= tl && tr <= r) cnt[p] += v;
     36     else
     37     {
     38         int mid = (tl + tr) >> 1;
     39         modify(p<<1, tl, mid, l, r, v);
     40         modify(p<<1|1, mid+1, tr, l, r, v);
     41     }
     42     gather(p, tl, tr);
     43 }
     44 
     45 int main(void)
     46 {
     47     int T;
     48     scanf("%d", &T);
     49     while(T--)
     50     {
     51         int n, x;
     52         scanf("%d %d", &n, &x);
     53         M.clear();
     54         for(int i = 1; i <= n; i++)
     55         {
     56             int y;
     57             scanf("%d", &y);
     58             M[y].push_back(i);
     59         }
     60 
     61         int p1 = 0, p2 = 0;
     62         for(it = M.begin(); it != M.end(); it++)
     63         {
     64             int now = (*it).first;
     65             vector<int> tmp = (*it).second;
     66             int sz = tmp.size();
     67             if(sz < x) continue;
     68             sort(tmp.begin(), tmp.end());
     69             for(int i = 0; i < sz - x + 1; i++)
     70             {
     71                 int x1, x2, y1, y2;
     72                 x1 = i ? tmp[i-1] + 1 : 1;
     73                 x2 = tmp[i];
     74                 y1 = tmp[i+x-1];
     75                 y2 = i == sz - x ? n : tmp[i+x] - 1;
     76                 a[p1++] = x1, a[p1++] = x2 + 1;
     77                 S[p2++] = seg(x1, x2 + 1, y1, 1);
     78                 S[p2++] = seg(x1, x2 + 1, y2 + 1, -1);
     79             }
     80         }
     81 
     82         LL ans = 0;
     83         sort(a, a + p1);
     84         int sz = unique(a, a + p1) - a;
     85         sort(S, S + p2, cmp);
     86         memset(cnt, 0, sizeof(cnt));
     87         memset(sum, 0, sizeof(sum));
     88         for(int i = 0; i < p2; i++)
     89         {
     90             int l = lower_bound(a, a + sz, S[i].l) - a + 1;
     91             int r = lower_bound(a, a + sz, S[i].r) - a;
     92             modify(1, 1, sz, l, r, S[i].f);
     93             ans = ans + sum[1] * (S[i+1].h - S[i].h);
     94         }
     95 
     96         printf("%I64d
    ", ans);
     97 
     98     }
     99     return 0;
    100 }
    Aguin
  • 相关阅读:
    敏捷软件开发和极限编程介绍
    内存泄漏检测方法
    cocopods 安装
    JavaScript学习笔记-数组(1)
    JavaScript对象应用-字符串和图片对象
    JavaScript基础-面向对象编程<2>
    JavaScript基础-面向对象编程<1>
    JavaScript基础-对象<2>
    JavaScript基础-对象<1>
    高性能朋友圈
  • 原文地址:https://www.cnblogs.com/Aguin/p/5679678.html
Copyright © 2011-2022 走看看