A.游游的字母变换

使用islower 和 isupper来判断大小写字母,接着使用%26的性质转化

void solve(){
    
    string s; cin>>s;
    for(auto&v:s){
        if(isupper(v)){
            int t = (v-'A'+1)%26;
            v = t + 'A';
        }
        else if(islower(v)){
            int t = (v-'a'-1+26)%26;
            v = t + 'a';
        }
    }
    cout << s << endl;
    return ;
}

B.游游的排列构造

依照题目意思,最多k只有n的一半,我们直接将n-m+1大的数间隔插入,中间放1,2,3这些即可,注意间隔的数要小于n-m+1

void solve(){
    
    cin>>n>>m;
    int j = 1;
    for(int i=1;i<=m;i++,j++){
        cout << n-m+j << ' ';
        if(j<n-m+1) cout << j << ' ';
    }
    while(j<n-m+1) cout << j++ << ' ';
    return ;
}

C.游游的二进制树

可以发现数据范围很小直接暴力dfs,注意大于r的时候终止

void solve(){
    
    LL l,r;
    cin>>n>>l>>r;
    vector<vector<int>> g(n+1);
    string s; cin>>s; s=' '+s;
    for(int i=1;i<n;i++){
        int a,b; cin>>a>>b;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    int ans = 0;
    function<void(int,int,LL)> dfs = [&](int u,int fa,LL res){
        res = res * 2 + (s[u]-'0');
        if(res>r) return ;
        if(u != fa and l<=res and res<=r) ans++; 
        for(auto&v:g[u]){
            if(v == fa) continue;
            dfs(v,u,res);
        }
    };
    
    for(int i=1;i<=n;i++) dfs(i,i,0ll);
    
    cout << ans << endl;
    return ;
}

D.游游的矩阵统计

注意到数值是很大的但是数量不大,所以肯定是双指针去滑动区间,注意贡献的区间是几个个区间的拼接区域 + 两个 区间的连续区域 我们考虑一直维护两个区间的相同数据量,到区间尽头了就滑动指针即可

void solve(){
    
    LL n; int m1,m2;
    
    cin>>n>>m1>>m2;
    vector<pair<int,LL>> v1(m1),v2(m2);
    for(auto&[a,b]:v1) cin>>a>>b;
    for(auto&[a,b]:v2) cin>>a>>b;
    
    int i = 0, j = 0;
    int li = -1, lj = -1;
    LL x = 0,y = 0;
    LL ans = 0;
    while(i<m1){
        LL same = min(v1[i].second-x,v2[j].second-y);
        int ni = v1[i].first, nj = v2[j].first;
        ans += ~li and (set{li,lj,ni,nj}.size() == 2);
        if(ni != nj) ans += same - 1;
        x += same;
        if(x == v1[i].second){
            x = 0;
            i++;
        }
        y += same;
        if(y == v2[j].second){
            y = 0;
            j++;
        }
        li = ni,lj = nj;
    }
    cout << ans << endl;
    return ;
}

E.小红的树构造

首先我们找出所有出现数的因数数量

可以发现4,9的因数都是3

6,8,27都是4

12,18都是6

可以发现突破点就是让因数小的出现的多,那么也就是2*3出现的越少越好那我们可以想到构造菊花图,把数量多的放在中间即可

LL qmi(LL a,LL b,LL p){
    LL res = 1;
    while(b){
        if(b&1) res = res * a % p;
        b >>= 1;
        a = a * a % p;
    }
    return res;
}

void solve(){
    
    cin>>n>>k;
    k = max(k,n-k);
    
    LL ans = qmi(3,k-1,mod) % mod * // 自己^2 (4 9) ->3
             qmi(4,n-k,mod) % mod *  // 自己 x 别人 (6) -> 4
             qmi(4,(LL)(k-1)*(k-2)/2,mod) % mod * // 自己^3 (8,27) -> 4
             qmi(6,(LL)(n-k)*(n-k-1)/2,mod) % mod * // 自己 x 别人^2
             qmi(6,(LL)(k-1)*(n-k),mod) % mod; // 自己^2 x 别人
    
    cout << ans << endl;
    
    return ;
}