zoukankan      html  css  js  c++  java
  • Codeforces Round #296 (Div. 2) A B C D

    A:模拟辗转相除法时记录答案

    B:3种情况:能降低2,能降低1。不能降低分别考虑清楚

    C:利用一个set和一个multiset,把行列分开考虑。利用set自带的排序和查询。每次把对应的块拿出来分成两块插入回去。然后行列分别取最大相乘的作为这次询问的答案

    D:一个区间覆盖问题的变形。注意公式的话。非常easy发现事实上x。w相应的就是一个[x - w, x + w]的区间,然后求最多不重合区间就可以

    代码:

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    typedef long long ll;
    
    ll a, b, ans;
    
    ll gcd(ll a, ll b) {
        if (!b) return a;
        ans += a / b;
        return gcd(b, a % b);
    }
    
    int main() {
        scanf("%lld%lld", &a, &b);
        gcd(a, b);
        printf("%lld
    ", ans);
        return 0;
    }
    

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N = 200005;
    int n;
    char a[N], b[N];
    
    int g[30][30];
    int vis[30];
    
    int main() {
        scanf("%d%s%s", &n, a + 1, b + 1);
        int sum = 0;
        for (int i = 1; i <= n; i++)
            if (a[i] != b[i]) sum++;
        for (int i = 1; i <= n; i++) {
            if (a[i] != b[i]) {
                if (g[b[i] - 'a'][a[i] - 'a']) {
                    printf("%d
    %d %d
    ", sum - 2, i, g[b[i] - 'a'][a[i] - 'a']);
                    return 0;
                }
                g[a[i] - 'a'][b[i] - 'a'] = i;
            }
        }
        for (int i = 1; i <= n; i++) {
            if (a[i] != b[i]) {
                vis[b[i] - 'a'] = i;
            }
        }
        for (int i = 1; i <= n; i++) {
            if (a[i] != b[i] && vis[a[i] - 'a']) {
                printf("%d
    %d %d
    ", sum - 1, i, vis[a[i] - 'a']);
                return 0;
            }
        }
        printf("%d
    -1 -1
    ", sum);
        return 0;
    }
    

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <set>
    using namespace std;
    
    int w, h, n;
    set<int> x[2];
    multiset<int> xx[2];
    char op[2];
    int v;
    set<int>::iterator it, l, r;
    multiset<int>::iterator tmp;
    
    long long gao(int tp) {
        x[tp].insert(v);
        it = x[tp].find(v);
        l = it; l--; r = it; r++;
        xx[tp].erase(xx[tp].find(*r - *l));
        xx[tp].insert(v - *l);
        xx[tp].insert(*r - v);
        long long ans = 1;
        tmp = xx[tp].end(); tmp--;
        ans *= *tmp;
        tmp = xx[!tp].end(); tmp--;
        ans *= *tmp;
        return ans;
    }
    
    int main() {
        scanf("%d%d%d", &w, &h, &n);
        x[0].insert(0); x[0].insert(w);
        x[1].insert(0); x[1].insert(h);
        xx[0].insert(w); xx[1].insert(h);
        while (n--) {
            scanf("%s%d", op, &v);
            printf("%lld
    ", gao(op[0] == 'H'));
        }
        return 0;
    }
    

    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    
    const int N = 200005;
    const int INF = 0x3f3f3f3f;
    
    struct Seg {
        int l, r;
        Seg() {}
        Seg(int l, int r) {
            this->l = l;
            this->r = r;
        }
    } seg[N];
    
    int n, x, w;
    
    bool cmp(Seg a, Seg b) {
        return a.r < b.r;
    }
    
    int main() {
        scanf("%d", &n);
        for (int i = 0; i < n; i++) {
            scanf("%d%d", &x, &w);
            seg[i] = Seg(x - w, x + w);
        }
        sort(seg, seg + n, cmp);
        int ans = 0;
        int r = -INF;
        for (int i = 0; i < n; i++) {
            if (seg[i].l >= r) {
                r = seg[i].r;
                ans++;
            }
        }
        printf("%d
    ", ans);
        return 0;
    }
    


  • 相关阅读:
    AcWing 1135. 新年好 图论 枚举
    uva 10196 将军 模拟
    LeetCode 120. 三角形最小路径和 dp
    LeetCode 350. 两个数组的交集 II 哈希
    LeetCode 174. 地下城游戏 dp
    LeetCode 面试题 16.11.. 跳水板 模拟
    LeetCode 112. 路径总和 递归 树的遍历
    AcWing 1129. 热浪 spfa
    Thymeleaf Javascript 取值
    Thymeleaf Javascript 取值
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/5112806.html
Copyright © 2011-2022 走看看