首页 > 其他分享 >Codeforce 962 Div3 C~E 题解

Codeforce 962 Div3 C~E 题解

时间:2024-07-27 14:31:57浏览次数:8  
标签:前缀 int 题解 long vector solve Codeforce using Div3

C

题目大意

​ 给定两个字符串a,b,q个询问,每次操作可以将a[i]赋值为任意一个字符,每次询问[l , r]区间内使得sorted(a[l, r]) == sorted(b[l, r])的最小操作次数

分析

​ 不妨先考虑一个区间如何判断sorted后的字串是否相等,发现跟字符出现的次数有关,于是考虑前缀和预处理每一个26个字母分别出现的次数,答案为不同字符数量之和除以2。时间复杂度O(q)。

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

void solve() {
    int n, q;
    cin >> n >> q;
    string a, b;
    cin >> a >> b;
    a = " " + a, b = " " + b;

    vector<vector<int>> mp1(n + 1, vector<int> (26)), mp2(n + 1, vector<int> (26));
    for (int i = 1; i <= n; i++) {
        for (char j = 'a'; j <= 'z'; j++) {
            mp1[i][j - 'a'] = mp1[i - 1][j - 'a'];
            mp2[i][j - 'a'] = mp2[i - 1][j - 'a'];
         }
         mp1[i][a[i] - 'a']++;
         mp2[i][b[i] - 'a']++;
    }
    while (q--) {
        int l, r, ans = 0;
        cin >> l >> r;
        for (char i = 'a'; i <= 'z'; i++) {
            ans += abs(mp1[r][i - 'a'] - mp1[l - 1][i - 'a'] - mp2[r][i - 'a'] + mp2[l - 1][i - 'a']);
        }

        cout << ans / 2 << '\n';
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

D

题目大意

​ 给定n, x,计算有多少个三元组(a, b, c)满足 a * b + b * c + a * c <= n 且 a + b + c <= x。a, b, c均为正整数。

分析

​ 不难想到先固定一个数再去考虑其他的数,不妨固定a,那么根据两个不等式,我们可以发现b <= n / a 且 b <= x - a - 1,因此b <= min(n / a, x - a - 1)。枚举b,每次答案加上min((n - a * b) / (a + b), x - a - b)即可。

​ 时间复杂度为O(min(n, x)sqrt(min(n, x)))

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

void solve() {
    int n, x;
    cin >> n >> x;

    i64 ans = 0;
    for (int i = 1; i <= min(n, x); i++) {
        for (int j = 1; j <= n / i && j <= x - i - 1; j++) {
            int c = min((n - i * j) / (i + j), x - i - j);
            ans += 1ll * c;
        }
    }

    cout << ans << "\n";
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

E

题目大意

​ 给定一个01串,求出所有的区间[l, r]的数量,使得其中至少有一个子区间[x, y]满足x到y中的0和1的计数相等。

分析

​ 从01串和区间问题不难想到前缀和的思想,如果是0,就加上-1,如果是1,就加上1,这样一来,所有前缀和为0的位置的贡献为n - i + 1(假设i为当前位置)。考虑前缀和不为0的情况,当pre[y] == pre[x - 1]时,显然L有x中取法,R有n - y + 1种取法,总方案数为x * (n - y + 1)。因此我们可以先预处理种每一种前缀下R的取法数之和,枚举x - 1,如果存在pre[x - 1],就加上与之匹配的R的方案数。注意枚举的x - 1,因此L的方案数应为i + 1。

​ 时间复杂度为O(nlogn)

代码

#include <bits/stdc++.h>

using namespace std;

using i64 = long long;

const int mod = 1e9 + 7;
void solve() {
    string s;
    cin >> s;
    int n = s.size();

    s = " " + s;
    vector<i64> pre(n + 1);
    map<int, i64> f;
    for (int i = 1; i <= n; i++) {
        pre[i] = (s[i] == '1' ? pre[i - 1] + 1 : pre[i - 1] - 1);
        f[pre[i]] += n - i + 1;
    }

    i64 ans = 0;
    for (int i = 1; i <= n; i++) {
        if (f[pre[i]]) {
            f[pre[i]] -= n - i + 1;
            ans = (ans + 1ll * f[pre[i]] * (i + 1)) % mod;
            if (pre[i] == 0) ans = (ans + n - i + 1) % mod;
        }
    }

    cout << (ans + mod) % mod << '\n';
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int T = 1;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

标签:前缀,int,题解,long,vector,solve,Codeforce,using,Div3
From: https://www.cnblogs.com/oyasumi-sion/p/18326898

相关文章

  • ABC273F Hammer 题解
    ABC273FHammer题解题目大意数轴上有\(n\)个锤子和\(n\)堵墙,第\(i\)个锤子位于\(x_i\),第\(i\)堵墙位于\(y_i\),第\(i\)个锤子可以对应的敲开第\(i\)堵墙。以原点为起点,给定终点\(t\),问最少移动多少个单位长度才能走到\(t\)。必须拿到对应锤子敲开墙才能走过这堵......
  • Codeforces Round 962 (Div. 3) 题解
    A.Legshttps://codeforces.com/contest/1996/problem/A翻译:农夫约翰的农场又迎来了美好的一天。农夫约翰来到农场后,数了数n条腿。众所周知,农场里只住着鸡和牛,一只鸡有2条腿,而一头牛有4条腿。假设约翰农场主数清了所有动物的腿,那么他的农场里最少有多少动物?思路求最少......
  • Codeforces Round 962 (Div. 3) 补题记录(A~G)
    这场Div.3难度高于平时。A#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=500100;inta[N];signedmain(){intT;scanf("%lld",&T);while(T--){intn;scanf("%lld",......
  • stata 代码实现熵值法计算 含常见问题解答
    适用:面板数据均可stata版本:无要求例如,使用了一个10年的省级面板数据,含15个指标,现在来计算各地区的熵值法得分。其中,x1x2x3x4x6x7x8x9x11x12x13x14x15是正向指标;而x5x10是负向指标。1.定义面板,定义指标的正负。tssetidyearglobalxlist1"x1x2x3x4x6x......
  • Codeforces Round 961
    省流:运气好没有掉分)B2Bonquet(HardVertion)(CF1995B2)事实上B1都写挂了(尖叫)处理花瓣数相差不超过1的花,可以用map存储每种花的数量,顺序遍历即可(其实是不想排序统计,好麻烦);那么如何计算最终答案呢。。。此处省略我赛时乱七八糟的一堆复杂做法,比较简单的写法是先找到一个可行的......
  • Codeforces 913 div3 A-G
    A题意分析把给定的坐标的那一行和那一列的其他所有坐标都输出来C++代码#include<iostream>usingnamespacestd;intmain(){ intt; cin>>t; while(t--){ strings; cin>>s; for(inti=1;i<=8;i++){ if(i+'0'!=s[1])cout<<s[0]<<i<<end......
  • CodeForces 1883A Morning
    题目链接:CodeForces1883A【Morning】思路    模拟,特判当密码中的某个元素为0时,用10减去当前光标的位置,并修改光标的位置为当前元素,再操作依次显示当前元素。对于其他情况则直接使用光标的位置减去目标位置,修改光标位置为当前元素,然后再操作一次显示当前元素。代码#......
  • CF585F Digits of Number Pi 题解
    Description给定长度为\(n\)的数字串\(s\)和长度为\(d\)的不含前导零的数字串\(x,y(x\ley)\)。求存在长度至少为\(\left\lfloor\frac{d}{2}\right\rfloor\)的子串是\(s\)的子串的数字串\(t\in[x,y]\)的数量。\(n\le10^3\),\(d\le50\),答案对\(10^9+7\)取......
  • CodeForces 1883B Chemistry
    题目链接:CodeForces1883B【Chemistry】思路    判断最多删去k个字符后剩下的部分为回文字符串,所以优先删除将个数为奇数个的相同字符删为偶数,当最后留下的字符串中,奇数个数的相同字符种类小于等于1时才会是回文字符串,如:aaabbbccc,此时个数为奇数的相同字符种类有三种,分......
  • CF578E Walking! 题解
    Description给定一个长度为\(n\)的只包含L,R的字符串\(s\)。构造一个\(n\)排列\(p\)满足\(s[p_i]\nes[p_{i+1}](1\lei<n)\)。最小化\(p\)中\(p_i>p_{i+1}(1\lei<n)\)的数量。\(n\le10^5\),数据保证有解。Solution考虑把\(p\)中的每个极长连......