【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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章