• 题解报告(CDUT暑期集训——第三场)


    题解报告(CDUT暑期集训——第三场)


    A - Problem A. Ascending Rating

    HDU - 6319

    • 思路:单调队列板子题?(但是弱的一批的我还是不会用(有空补上 用的滑动窗口算法 按着题解的从后往前做(ps:菜是原罪

    • AC代码


    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    #include<string.h>
    #include<queue>
    #include<set>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll Pow_mod(ll a, ll b, ll c){
        ll ans = 1;
        a %= c;
        while (b){
            if (b & 1) ans = (ans * a) % c;
            a = (a * a) % c;
            b >>= 1;
        }
        return (ans % c);
    }
    
    const int N = 10000010;
    
    int t;
    ll n, m, k, p, q, r, mod;
    ll a[N], b[N], c[N];
    
    void calc(){
        ll l = 0, r = 0, tot = 0, t_ = n, tmp = 0;
        ll cnt = 0, ans = 0;
        b[0] = 0;
        c[0] = 0;
        for (int i = n; i >= 1; i -- ){
            tot ++;
            if (i == n){
                c[r] = i;
                b[r ++] = a[i];
                if (m == 1){
                    tmp ++;
                    ans = b[l] ^ (t_ - m + 1);
                    cnt = (r - l) ^ (t_ - m + 1);
                    t_ --;
                }
                continue;
            }
            if (tot > m){
                tot --;
                while (r > l && c[l] >= n - tmp + 1) l ++;
            }
            if (a[i] < b[r - 1] || r == l){
                c[r] = i;
                b[r ++] = a[i];
            }
            else{
                while (r > l && a[i] >= b[r - 1]) r --;
                c[r] = i;
                b[r ++] = a[i];
            }
            if (tot == m){
                ans += b[l] ^ (t_ - m + 1);
                cnt += (r - l) ^ (t_ - m + 1);
                tmp ++;
                t_ --;
            }
        }
        printf("%lld %lld
    ", ans, cnt);
    }
    
    int main(){
        scanf("%d", &t);
        while (t -- ){
            scanf("%lld%lld%lld%lld%lld%lld%lld", &n, &m, &k, &p, &q, &r, &mod);
            for (int i = 1; i <= n; i ++ ){
                if (i <= k) scanf("%lld", &a[i]);
                else a[i] = ((p * a[i - 1] + q * i + r) % mod + mod) % mod;
                b[i] = 0;
                c[i] = 0;
            }
            calc();
        }
        return 0;
    }
    

    D - Problem D. Euler Function

    HDU - 6322

    • 思路:打表秒出规律 没啥说的

    • AC代码


    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    #include<string>
    #include<string.h>
    #include<vector>
    #include<stack>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll Pow_mod(ll a, ll b, ll c){
        ll ans = 1;
        a %= c;
        while (b){
            if (b & 1) ans = (ans * a) % c;
            a = (a * a) % c;
            b >>= 1;
        }
        return (ans % c);
    }
    
    int t, k;
    
    int main(){
        scanf("%d", &t);
        while (t -- ){
            scanf("%d", &k);
            if (k == 1) printf("%d
    ", 5);
            else printf("%d
    ", k + 5);
        }
        return 0;
    }
    

    F - Problem F. Grab The Tree

    HDU - 6324

    • 思路:简单思维题+博弈(?)

    • AC代码


    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    #include<string>
    #include<string.h>
    #include<vector>
    #include<stack>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll Pow_mod(ll a, ll b, ll c){
        ll ans = 1;
        a %= c;
        while (b){
            if (b & 1) ans = (ans * a) % c;
            a = (a * a) % c;
            b >>= 1;
        }
        return (ans % c);
    }
    
    const int N = 100010;
    
    int t, n, x, y, tmp, cnt;
    
    int main(){
        scanf("%d", &t);
        while (t -- ){
            scanf("%d", &n);
            scanf("%d", &tmp);
            cnt = tmp;
            for (int i = 1; i < n; i ++ ){
                scanf("%d", &tmp);
                cnt ^= tmp;
            }
            for (int i = 1; i < n; i ++ )
                scanf("%d%d", &x, &y);
            if (cnt) printf("Q
    ");
            else printf("D
    ");
        }
        return 0;
    }
    

    L - Problem L. Visual Cube

    HDU - 6330

    • 思路:水题 画图即可(水题我都wa了一发 还交成A交错了一发(菜是原罪

    • AC代码


    #include<stdio.h>
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    #include<string>
    #include<string.h>
    #include<vector>
    #include<stack>
    typedef long long ll;
    typedef unsigned long long ull;
    using namespace std;
    
    ll Pow_mod(ll a, ll b, ll c){
        ll ans = 1;
        a %= c;
        while (b){
            if (b & 1) ans = (ans * a) % c;
            a = (a * a) % c;
            b >>= 1;
        }
        return (ans % c);
    }
    
    const int N = 100;
    
    int t, a, b, c;
    char ans[100][100];
    
    void draw(int a, int b, int c){
        for (int i = 0; i < 2 * b; i ++ ){
            for (int j = 2 * b - i; j < 2 * (a + b) - i + 1; j ++ ){
                if (i & 1){
                    if (j & 1) ans[i][j] = '/';
                }
                else{
                    if (j & 1) ans[i][j] = '-';
                    else ans[i][j] = '+';
                }
            }
        }
        for (int i = 2 * b; i < 2 * (b + c) + 1; i ++ ){
            for (int j = 0; j < 2 * a + 1; j ++ ){
                if (i & 1){
                    if (!(j & 1)) ans[i][j] = '|';
                }
                else{
                    if (j & 1) ans[i][j] = '-';
                    else ans[i][j] = '+';
                }
            }
        }
        for (int i = 2 * (a + b); i >= 2 * a + 1; i -- ){
            for (int j = 2 * (a + b) - i; j < 2 * (a + b + c) - i + 1; j ++ ){
                if (i & 1){
                    if (j & 1) ans[j][i] = '/';
                }
                else{
                    if (j & 1) ans[j][i] = '|';
                    else ans[j][i] = '+';
                }
            }
        }
        for (int i = 0; i < 2 * (b + c) + 1; i ++){
            for (int j = 0; j < 2 * (a + b) + 1; j ++ )
                printf("%c", ans[i][j]);
            printf("
    ");
        }
    }
    
    int main(){
        scanf("%d", &t);
        while (t -- ){
            memset(ans, '.', sizeof(ans));
            scanf("%d%d%d", &a, &b, &c);
            draw(a, b, c);
        }
        return 0;
    }
    
  • 相关阅读:
    定义一个动态的二维数组?
    学习STL map, STL set之数据结构基础
    CMM
    详细解说STL string
    仔细选择你的容器
    C++字符串类string简析
    流氓软件及反流氓软件的技术分析
    标准C++的类型转换符:static_cast、dynamic_cast、reinterpret_cast和const_cast
    C++资料下载
    unix系统操作命令大全
  • 原文地址:https://www.cnblogs.com/Misuchii/p/11223307.html
Copyright © 2020-2023  润新知