首页 > 其他分享 >Educational Codeforces Round 155 (Rated for Div. 2)

Educational Codeforces Round 155 (Rated for Div. 2)

时间:2023-09-25 16:00:10浏览次数:38  
标签:Educational Rated const int ll cnt using 155 sum

Educational Codeforces Round 155 (Rated for Div. 2)

A. Rigged!

解题思路:

若存在\(s[i] >= s[1]\)并且\(e[i] >= e[i]\),那么答案为\(-1\).

否则,答案为\(s[1]\).

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
const int M = 2 * M;
typedef pair<int, int> pii;
#define fi first
#define se second
int n, m, k;

void solve()
{
    scanf("%d", &n);
    vector<int> s(n + 1), e(n + 1);
    bool sus = true;
    bool gs = false;
    bool ge = false;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d %d", &s[i], &e[i]);
        if (i > 1)
        {
            if (s[i] >= s[1] && e[i] >= e[1])
            {
                sus = false;
            }
        }
    }
    if (!sus)
    {
        printf("-1\n");
    }
    else
    {
        printf("%d\n", s[1]);
    }
}

int main()
{
    int t = 1;
    scanf("%d", &t);
    while (t--)
    {
        solve();
    }
    return 0;
}

B .Chips on the Board

解题思路:

要么每行选最小,要么每列选最小。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
const int M = 2 * M;
typedef pair<int, int> pii;
#define fi first
#define se second
int n, m, k;

void solve()
{
    scanf("%d", &n);
    vector<int> a(n + 1), b(n + 1);
    int mina = 1e9 + 1;
    int minb = 1e9 + 1;
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        mina = min(mina, a[i]);
    }
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &b[i]);
        minb = min(minb, b[i]);
    }
    ll ans = 0;
    for (int i = 1; i <= n; i++)
    {
        ans += b[i] + mina;
    }
    ll res = 0;
    for (int i = 1; i <= n; i++)
    {
        res += a[i] + minb;
    }
    ans = min(ans, res);
    printf("%lld\n", ans);
}

int main()
{
    int t = 1;
    scanf("%d", &t);
    while (t--)
    {
        solve();
    }
    return 0;
}

C. Make it Alternating

解题思路:

找到有多少个连续段\(res\).

每个段中有\(cnt_1,cnt_2,...,cnt_k\)个数。

我们从每个段中选择一个留下来的数\(cnt_1 * cnt_2* ...*cnt_k\),第\(i\)段有\(cnt_i\)中选法。

我们要删掉\(num = \sum_\limits{i = 1}^k cnt_i - res\)个数,每个段只留一个。

将这\(num\)个数进行排列\(num!\)

\(ans = (\prod\limits_{i = 1}^kcnt_i * num!) \%mod\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
const int M = 2 * M;
const int mod = 998244353;
typedef pair<int, int> pii;
#define fi first
#define se second
int n, m, k;
ll f[N];

void solve()
{
    string s;
    cin >> s;
    n = s.size();
    s = ' ' + s;
    ll cnt = 0;
    ll ans = 1;
    ll res = 0;
    for (int i = 2; i <= n; i++)
    {
        if (s[i] == s[i - 1])
        {
            cnt++;
        }
        else
        {
            if (cnt)
            {
                ans = (ans * (cnt + 1)) % mod;
            }
            res += cnt;
            cnt = 0;
        }
    }
    if (cnt)
    {
        ans = (ans * (cnt + 1)) % mod;
        res += cnt;
        cnt = 0;
    }
    ans = (ans * f[res]) % mod;
    printf("%lld %lld\n", res, ans);
}

int main()
{
    int t = 1;
    f[0] = 1;
    f[1] = 1;
    for (int i = 1; i <= N - 5; i++)
    {
        f[i] = (f[i - 1] * i) % mod;
    }
    scanf("%d", &t);
    while (t--)
    {
        solve();
    }
    return 0;
}

D .Sum of XOR Functions

解题思路:

\[\begin{align*} s_k &= \bigoplus_{i=1}^ka_i \\ f(l,r) &= \bigoplus_{i=l}^r a_i \\ &= s_r \oplus s_{l-1} \end{align*} \]

\[\begin{align*} ans &= \sum_{l= 1}^n\sum_{r=l}^n f(l,r)\cdot(r - l + 1) \\ &= \sum_{l= 1}^n\sum_{r=l}^n f(l,r)\cdot r- f(l,r)\cdot (l - 1)\\ &= \sum_{l= 0}^n\sum_{r=l}^n (\sum_{i = 1} ^ {32} 2^{i} * ((s_r \& 2^i) \oplus (s_l \&2^i))*(r - l))\\ \end{align*} \]

那么对于每一个\(s_i\)来说,假设第\(j\)位为\(1\),他的左侧有\(k\)个数的第\(j\)位为\(0\)。

那么但对于这个数的这一位的和左边比对的的贡献为

\[\begin{align*} res &=2^i [(r-l_1) + (r - l_2) + ... + (r - l _k)]\\ &=2^i[kr - \sum_\limits{i = 1}^kl_i] \end{align*} \]

所以,我们在遍历的时候,将所有的\(l_i\)累加,并计算\(k\)即可。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e6 + 10;
const int M = 2 * M;
const int mod = 998244353;
typedef pair<int, int> pii;
#define fi first
#define se second
int n, m, k;

void solve()
{
    scanf("%d", &n);
    vector<ll> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &a[i]);
        a[i] ^= a[i - 1];
    }
    vector<vector<ll>> f(40, vector<ll>(4));
    vector<vector<ll>> cnt(40, vector<ll>(4));
    ll ans = 0;
    for (int i = 0; i <= n; i++)
    {
        for (int j = 32; j >= 0; j--)
        {
            if (a[i] >> j & 1)
            {
                ans = (ans + (((((cnt[j][0] * (ll)i - f[j][0]) % mod + mod) % mod) * (1ll << j)) % mod)) % mod;
                f[j][1] = (f[j][1] + i) % mod;
                cnt[j][1] = (cnt[j][1] + 1) % mod;
            }
            else
            {
                ans = (ans + (((((cnt[j][1] * (ll)i - f[j][1]) % mod + mod) % mod) * (1ll << j)) % mod)) % mod;
                f[j][0] = (f[j][0] + i) % mod;
                cnt[j][0] = (cnt[j][0] + 1) % mod;
            }
        }
    }
    printf("%lld\n", ans);
}

int main()
{
    int t = 1;
    // scanf("%d", &t);
    while (t--)
    {
        solve();
    }
    return 0;
}

标签:Educational,Rated,const,int,ll,cnt,using,155,sum
From: https://www.cnblogs.com/value0/p/17728113.html

相关文章

  • CF_EduRound155小丑寄
    一句话总结:A题理解错了,数据又水,所以寄了。过程:22:35开题。22:40怎么还没加载出来??急急急22:42哦,严格大于,但是主宾对调了,乐乐乐乐乐乐乐,cout<<ans;\(\rightarrow\)cout<<ans-1;22:45一发过。。。22:45-23:38啥事没有。23:38开E题23:50左右好像有点思路......
  • Educational Codeforces Round 155 (Rated for Div. 2)
    比赛链接A.Rigged!题目链接就是一个比较简单的模拟就可以解决,如何判断能不能第一只需要考虑比他力量大的耐力是不是也比他大就行,而只要比他大,他就不可能第一,否则输出他的力量作为标杆就行,这样也可以避免比他力量小的也可以举起来。#include<bits/stdc++.h>usingnamespaces......
  • Educational Codeforces Round 97 (Rated for Div 2) G. Death DBMS
    Problem-G-Codeforces题意给定n个字符串,每个字符串有一个值val,n次询问,每次给一个字符串,询问给定n个字符串中是询问字符串子串的值的最大值分析多模式匹配,从中找到给定串的子串,想到建立ac自动机,对于给定字符串,在自动机上面匹配时,沿fail指针向上跳并求最大值即可,由于n个字符......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)
    Preface这场因为晚上去做大物实验了,到寝室洗完澡都11点了,就没现场打了的说后面补题发现前5题都很一眼,虽然补题的时候E题FST了(T在了42个点,如果放在比赛就FST了),F题还是很有意思的一个题目的说A.MEXanizedArray简单讨论一下即可#include<cstdio>#include<iostream>#include......
  • Educational Codeforces Round 123 - D(思维题)
    目录D.CrossColoringD.CrossColoring题意$n\timesm$的方格纸上进行q次操作,每次操作选择某整行x和某整列y,使得行x和列y均涂上k种颜色中的一种。问你最终的方案数思路倒序考虑操作,因为对于同一行或者同一列,后面的操作覆盖前面的操作利用数组标记某行或者某......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!) 更新ing
    A.MEXanizedArray题意给你三个数\(n\)、\(k\)、\(x\),让你求出能否构造出mex为\(k\),且所有数字都不超过\(x\),大小为\(n\)的数组。线索1如果有存在-1情况,先想啥时候不可能,如果能一下子找到-1的情况,这个题会很简单,因为可以的情况反推过去很容易,如果特判复杂就想想是不是诈骗规......
  • Educational Codeforces Round 154 (Rated for Div. 2) A-D
    传送门:edu154/div2A.PrimeDeletion题意:给定一个0-9的排列,要求一个长度>=2的子序列,使得该子序列是质数做法:考虑31或者13即可。不过当时没有立刻想到,感觉1000以内的质数必有答案,打了暴力。用时就多了点。Code#include<bits/stdc++.h>usingnamespacestd;intpri[10......
  • Educational Codeforces Round 143
    A.TwoTowers#include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#definempmake_pairusingpii=pair<int,int>;usingvi=vector<int>;constexprintinf=1e18;voidsolve(){intn,m,cnt=0;stringa,......
  • CodeTON Round 6 (Div. 1 + Div. 2, Rated, Prizes!)(A-D)
    CodeTONRound6(Div.1+Div.2,Rated,Prizes!)A.让你找mex为k的n个数,这n个数从0-x,问n个数的和最大值是多少先判断不行的。然后行的肯定有0-k-1,剩下还有就选x就行。查看代码#include<iostream>usingnamespacestd;typedeflonglongll;voidsolve(){ intn,k,x;......
  • Educational Codeforces Round 107
    依然是四题,但是感觉太久没打,好像变得迟钝了。B题大概就是令\[c={10}^k,a=c*3^k,b=c*2^k\]C的话直接暴力维护每种颜色的第一个位置就行,反正只有50个D的话刚开始没什么想法,构造题什么的真的不会啊打表之后发现,对于k,在cost为0的情况下,最多能造出长度为\(k^2+1\)的串,也就是能够......