zoukankan      html  css  js  c++  java
  • HDU多校Round 4

    Solved:3

    rank:405.................................

    B. Harvest of Apples

    知道了S(n,m) 可以o(1)的求S(n - 1, m),S(n + 1,m),S(n,m - 1),S(n,m + 1)  天秀莫队

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    using namespace std;
    typedef long long ll;
    const ll mod = 1e9 + 7;
    
    int blo = 200;
    ll ans;
    ll f[100005];
    ll inv[100005];
    ll anss[100005];
    
    ll pow_mod(ll x, ll y)
    {
        ll res = 1;
        while(y)
        {
            if(y & 1) res = res * x % mod;
            x = x * x % mod;
            y >>= 1;
        }
        return res;
    }
    
    void prework()
    {
        f[0] = 1; inv[0] = 1;
        for(int i = 1; i <= 100000; i++) f[i] = f[i - 1] * 1LL * i % mod;
        for(int i = 1; i <= 100000; i++) inv[i] = pow_mod(f[i], mod - 2LL);
    }
    
    struct node
    {
        int n, m, id;
    }E[100005];
    
    bool cmp(node A, node B)
    {
        int a = (A.n - 1) / blo;
        int b = (B.n - 1) / blo;
        if(a == b) return A.m < B.m;
        else return a < b;
    }
    
    int main()
    {
        ans = 1;
        prework();
        int T;
        scanf("%d", &T);
        for(int i = 1; i <= T; i++)
        {
            scanf("%d%d", &E[i].n, &E[i].m);
            E[i].id = i;
        }
        sort(E + 1, E + 1 + T, cmp);
        
        ll n = 1, m = 0;
        for(int i = 1; i <= T; i++)
        {
            while(n < E[i].n)
            {
                ans *= 2LL; 
                ll tmp = f[n] * inv[m] % mod * inv[n - m] % mod;
                ans = (ans - tmp + mod) % mod;
                n++;
            }
            while(m > E[i].m)
            {
                ll tmp = f[n] * inv[m] % mod * inv[n - m] % mod;
                ans = (ans - tmp + mod) % mod;
                m--;
            }
            while(n > E[i].n)
            {
                ll tmp = f[n - 1] * inv[m] % mod * inv[n - 1 - m] % mod;
                ans += tmp;
                ans = ans * inv[2] % mod;
                n--;
            }
            while(m < E[i].m)
            {
                ll tmp = f[n] * inv[m + 1] % mod * inv[n - m - 1] % mod;
                ans = (ans + tmp) % mod;
                m++;
            }
            anss[E[i].id] = ans;
        }
        for(int i = 1; i <= T; i++) printf("%lld
    ", anss[i]);
        return 0;
    }
    View Code

    D. Nothing is Impossible

    题意出锅 秒变签到题

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    #include <string.h>
    using namespace std;
    typedef long long ll;
    
    struct node
    {
        int a, b;
    }E[105];
    
    bool cmp(node A, node B)
    {
        return A.b < B.b;
    }
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            int n, m;
            scanf("%d%d", &n, &m);
            for(int i = 1; i <= n; i++) scanf("%d%d", &E[i].a, &E[i].b);
            sort(E + 1, E + 1 + n, cmp);
            
            ll tmp = 1;
            int ans = n;
            for(int i = 1; i <= n; i++)
            {
                if(tmp * (E[i].b + 1LL) <= m)
                {
                    tmp *= (E[i].b + 1LL);
                }
                else
                {
                    ans = i - 1;
                    break;
                }
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code

      

    J. Let Sudoku Rotate

    玄学剪纸 把一个矩阵翻转的话就考虑换一种方法遍历 转四次相当于转一圈 dfs回来的时候要恢复状态

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    #include <cmath>
    #include <string.h>
    using namespace std;
    
    int ans;
    int num[20][20];
    int tmp[20][20];
    int vis[20];
    
    int cal(char x)
    {
        if(x - '0' >= 0 && x - '0' <= 9) return x - '0';
        else return 10 + x - 'A';
    }
    
    void rotate(int x, int y)
    {
        int ix = x * 4 - 3;
        int iy = y * 4 - 3;
        for(int i1 = ix, i2 = iy; i2 <= iy + 3; i2++, i1++)
            for(int j1 = iy, j2 = ix + 3; j2 >= ix; j1++, j2--)
                tmp[i1][j1] = num[j2][i2];
        for(int i = ix; i <= ix + 3; i++)
            for(int j = iy; j <= iy + 3; j++)
                num[i][j] = tmp[i][j];
    }
    
    bool check(int x, int y)
    {
        int ix = x * 4 - 3;
        int iy = y * 4 - 3;
        
        for(int i = ix; i <= ix + 3; i++)
        {
            memset(vis, 0, sizeof(vis));
            for(int j = 1; j <= y * 4; j++)
            {
                if(vis[num[i][j]]) return false;
                vis[num[i][j]] = 1;
            }
        }
        for(int j = iy; j <= iy + 3; j++)
        {
            memset(vis, 0, sizeof(vis));
            for(int i = 1; i <= x * 4; i++)
            {
                if(vis[num[i][j]]) return false;
                vis[num[i][j]] = 1;
            }
        }
        return true;
    }
    
    void dfs(int x, int y, int st)
    {
        if(x == 5)
        {
            ans = min(ans, st);
            return;
        }
        
        for(int i = 0; i <= 3; i++)
        {
            if(i != 0) rotate(x, y);
            if(check(x, y))
            {
                if(y != 4) dfs(x, y + 1, st + i);
                else dfs(x + 1, 1, st + i);
            }
        }
        rotate(x, y);
    }
    
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            ans = 100;
            for(int i = 1; i <= 16; i++)
            {
                char s[20]; scanf("%s", s + 1);
                for(int j = 1; j <= 16; j++) num[i][j] = cal(s[j]);
            }
            dfs(1, 1, 0);
            printf("%d
    ", ans);
        }
        return 0;
    }
    View Code

    K. Expression in Memories

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    #include <string.h>
    using namespace std;
    
    char s[505];
    int vis[505];
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            memset(vis, 0, sizeof(vis));
            scanf("%s", s);
            int len = strlen(s);
            bool f = true;
            
            for(int i = 0; i < len; i++)
            {
                if(s[i] == '+')
                {
                    if(i == 0 || i == len - 1) f = false;
                    if(i + 1 < len && s[i + 1] == '+') f = false;
                    if(i + 1 < len && s[i + 1] == '*') f = false;
                }
                else if(s[i] == '*')
                {
                    if(i == 0 || i == len - 1) f = false;
                    if(i + 1 < len && s[i + 1] == '+') f = false;
                    if(i + 1 < len && s[i + 1] == '*') f = false;
                }
                else if(s[i] - '0' > 0 && s[i] - '0' <= 9) vis[i] = 1;
                else if(s[i] == '0')
                {
                    if(i - 1 >= 0 && vis[i - 1] == 1) vis[i] = 1;
                    else
                    {
                        if(i + 1 < len && s[i + 1] - '0' >= 0 && s[i + 1] - '0' <= 9) f = false;
                        else if(i + 1 < len && s[i + 1] == '?') s[i + 1] = '+';
                    }
                }
                else if(s[i] == '?')
                {
                    if(i == 0 || i + 1 == len) s[i] = '1', vis[i] = 1;
                    else if(i - 1 >= 0 && vis[i - 1] == 0)
                    {
                        if(s[i - 1] == '0') s[i] = '+';
                        else s[i] = '1', vis[i] = 1;
                    }
                    else
                    {
                        s[i] = '1', vis[i] = 1;
                    }
                }
            }
            if(!f) puts("IMPOSSIBLE");
            else printf("%s
    ", s);
        }
        return 0;
    }
    View Code

    L. Graph Theory Homework

    #include <stdio.h>
    #include <algorithm>
    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int q[100005];
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            int n;
            scanf("%d", &n);
        
            for(int i = 1; i <= n; i++) scanf("%d", &q[i]);
            int ans = sqrt(abs(q[n] - q[1]));
            printf("%d
    ", ans);    
        }
        return 0;
    }
    View Code
  • 相关阅读:
    3.2.8.1 打印与否
    3.2.8 sed 的运作
    3.2.7.1 替换细节
    3.2.7 基本用法
    3.2.6 在文本文件里进行替换
    3.2.5 程序与正则表达式
    pgm2
    pgm6
    pgm7
    pgm8
  • 原文地址:https://www.cnblogs.com/lwqq3/p/9404574.html
Copyright © 2011-2022 走看看