【codeforces】Round #313 (Div. 2)

题目

A:Currency System in Geraldion
B:Gerald is into Art
C:Gerald’s Hexagon
D:Equivalent Strings
E:Gerald and Giant Chess

T1

有1就都行,没“1”一不行

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

int n;

int main() {
    scanf("%d", &n);
    int minn = 2000000000;
    rep(i, 1, n) {
        int x;
        scanf("%d", &x);
        if (x < minn) minn = x;
    }
    if (minn == 1) printf("-1\n");
    else printf("1\n");
    return 0;
}

T2

两种画有四种排布方式
分别判断

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

int a1, b1, a2, b2, a3, b3;

bool check1() {
    int lx = a2 + a3, ly = max(b2, b3);
    if (lx < ly) swap(lx ,ly);
    if (lx <= a1 && ly <= b1) return 1;
    else return 0;
}

bool check2() {
    int lx = a2 + b3, ly = max(b2, a3);
    if (lx < ly) swap(lx ,ly);
    if (lx <= a1 && ly <= b1) return 1;
    else return 0;  
}

bool check3() {
    int lx = b2 + a3, ly = max(a2, b3);
    if (lx < ly) swap(lx ,ly);
    if (lx <= a1 && ly <= b1) return 1;
    else return 0;
}

bool check4() {
    int lx = b2 + b3, ly = max(a2, a3);
    if (lx < ly) swap(lx ,ly);
    if (lx <= a1 && ly <= b1) return 1;
    else return 0;
}

int main() {
    scanf("%d%d", &a1, &b1);
    if (a1 < b1) swap(a1, b1);
    scanf("%d%d", &a2, &b2);
    if (a2 < b2) swap(a2, b2);
    scanf("%d%d", &a3, &b3);
    if (a3 < b3) swap(a3, b3);
    if (check1()) printf("YES\n");
    else if (check2()) printf("YES\n");
    else if (check3()) printf("YES\n");
    else if (check4()) printf("YES\n");
    else printf("NO\n");
    return 0;
}

T3

推公式,用平方代换避免讨论顺序

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

int l[20];

int main() {
    rep(i, 1, 6) scanf("%d", &l[i]);
    printf("%d\n", (l[2] + l[3] + l[4]) * (l[2] + l[3] + l[4]) - l[2] * l[2] - l[4] * l[4] - l[6] * l[6]);
    return 0;
}

T4

字符串hash,递归判相同
注意dfs时候的顺序,否则会TLE
这题数据有毒-_-||

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define ui unsigned long long

const int N = 210000;
const int x = 123;
char s1[N], s2[N];
ui h1[N], h2[N], xp[N];
int n;

inline bool check(int l1, int l2, int L) {
    return (h1[l1] - h1[l1 + L] * xp[L]) == (h2[l2] - h2[l2 + L] * xp[L]);
}

inline bool judge(int l1, int l2, int L) {
    if (L & 1) return check(l1, l2, L);
    else {
        L >>= 1;
        return (check(l1, l2, (L << 1)))
            || (judge(l1, l2, L) && judge(l1 + L, l2 + L, L))
            || (judge(l1 + L, l2, L) && judge(l1, l2 + L, L));
    }
}

int main() {
    scanf("%s", s1); scanf("%s", s2);
    n = strlen(s1);
    h1[n] = 0;
    red(i, n - 1, 0) h1[i] = h1[i + 1] * x + (s1[i] - 'a');
    h2[n] = 0;
    red(i, n - 1, 0) h2[i] = h2[i + 1] * x + (s2[i] - 'a'); 
    xp[0] = 1;
    rep(i, 1, n) xp[i] = xp[i - 1] * x;
    if (judge(0, 0, n)) printf("YES\n");
    else printf("NO\n");
    return 0;
}

T5

题目大意:
给定h*w的格子,n个不可走的点,从(1,1)到(h,w)点,每次只能向下或者向右,求有多少种走法?
解题思路:
首先先不考虑不可走的点,有C(h+w-2,h-1)种走法,一共走h+w-2步,向下的有h-1步。接着考虑其中的不可走的点,对于一个不可走的点(x,y),它走到这个的点的走法是dp[i],它少走的是dp[i]*C(h-x,w-y,h-x),于是把每个不可走的点当为终点,可以求出所有的走法数。

#include <bits/stdc++.h>
using namespace std;  
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define red(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

int h,w,n;  
const int N= 200100;  
const int mod = 1000000007;  
ll c[N], inv[N];
ll dp[5000];
struct node {  
    int x, y;
}a[10000];

ll pow_mod(ll a, int b) {
    ll ans = 1;  
    while(b) { 
        if (b & 1) ans=(ans*a)%mod;  
        a = (a * a) % mod;  
        b /= 2;  
    }  
    return ans;  
}  

ll com(int x, int y) {// Calculate the Combination
    return ((c[x] * inv[y]) % mod * inv[x - y]) % mod;  
}  

bool cmp(node u, node v) {
    if(u.x == v.x)  
    return u.y < v.y;  
    return u.x < v.x;  
}

int main() {  
    scanf("%d%d%d", &h, &w, &n);  
    rep(i, 0, n - 1) scanf("%d%d", &a[i].x, &a[i].y);  
    sort(a, a + n, cmp);
    ll ans = 0;  
    c[0] = 1;  
    rep(i, 1, N - 1) c[i] = c[i - 1] * i % mod;  
    inv[0] = 1;
    rep(i, 1, N - 1) inv[i] = pow_mod(c[i], mod - 2); //Calculate the Inverse With Fermat Theory
    ans = com(h + w - 2, h - 1);  
    rep(i, 0, n - 1) {
        dp[i] = com(a[i].x + a[i].y - 2, a[i].x - 1);  
        rep(j, 0, i - 1) {//Calculate Solutions that Pass Point i
            if (a[j].x <= a[i].x && a[j].y <= a[i].y) {//Judge if Point i is availale
                dp[i] -= (dp[j] * com(a[i].x - a[j].x + a[i].y - a[j].y, a[i].x - a[j].x)) % mod;  
                dp[i] = (dp[i] + mod) % mod;  
            }  
        }  
        ans = (ans - (dp[i] * com(h + w - a[i].x - a[i].y, h - a[i].x)) % mod + mod) % mod;  
    }  
    cout << ans << endl;  
    return 0;  
}  

尾声

第一次做Virtual Contest,感觉还是听不错的呢
现场感还是很强的,有时间限制效果很好
VC时AC了前四题
第四题就不多吐槽了,不仅有毒还看脸,被FYD附体
程序公然违抗意志,完全不按基本法来
难道我没有HBH帅吗-_-||
肯定是没有的啦~~

End.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值