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\n", 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\n", 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\n", 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\n", 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\n", ans);    
    }
    return 0;
}
View Code

 

posted @ 2018-08-01 23:15  lwqq3  阅读(126)  评论(0编辑  收藏  举报