首页 > 其他分享 >Codeforces Round 924 (Div. 2)

Codeforces Round 924 (Div. 2)

时间:2024-02-11 19:55:08浏览次数:32  
标签:int res ll Codeforces long using Div 924 define

Codeforces Round 924 (Div. 2)

A - Rectangle Cutting

解题思路:

初始矩形长宽为\((a,b)\),如果我们切\(a\),那么一定不能再拼接\(a\),否则一定一样。所以我们拼接\(b\),即将\(a\)对半分开得到两个\((\frac{a}{2},b)\)矩形拼接。

此时,如果\(\frac{a}{2} = b\)那么拼接出来的矩形和初始一样。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int a, b;
    cin >> a >> b;
    if (a % 2 == 0 || b % 2 == 0)
    {
        if (a % 2 == 0)
        {
            if (b != a / 2)
            {
                puts("YES");
                return;
            }
        }
        if (b % 2 == 0)
        {
            if (a != b / 2)
            {
                puts("YES");
                return;
            }
        }
        puts("NO");
    }
    else
    {
        puts("NO");
    }
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

B - Equalize

解题思路:

排序,如果一段非递减区间中最大值减最小值的差在\(n -1\)之内,那么区间中不同数的个数就是通过加一个排列能得到相同数的数量。

所以一个队列扫过去。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int n;
    cin >> n;
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    sort(a.begin() + 1, a.end());
    int ans = 0;
    set<int> s;
    deque<int> q;
    for (int i = 1; i <= n; i++)
    {
        while (q.size() && a[i] - a[q.front()] >= n)
        {
            s.erase(a[q.front()]);
            q.pop_front();
        }
        q.push_back(i);
        s.insert(a[i]);
        ans = max(ans, (int)s.size());
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

C - Physical Education Lesson

解题思路:

对于当前\(x\)有两种位置情况,一种是从\(1 \sim k\)时数到\(x\),另一种是\(k - 1 \sim 2\)时数到\(x\)。

  • 第一种:\(2k - 2= n - x = s\)
  • 第二种:\(2k - 2 = n + (x - 2) = s\)。

我们对两种\(s\)分别枚举出其因子,然后求出\(k\)的个数即可。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;

void solve()
{
    int n, x;
    cin >> n >> x;
    int s = n - x;
    vector<int> f;
    for (int i = 2; i <= s / i; i++)
    {
        if (s % i == 0)
        {
            f.push_back(i);
            if (s / i != i)
            {
                f.push_back(s / i);
            }
        }
    }
    f.push_back(s);
    set<int> se;
    for (auto v : f)
    {
        int t = (v + 2) / 2;
        if (t != 1 && t >= x && t * 2 - 2 == v)
        {
            se.insert(t);
        }
    }
    if (x > 1)
    {
        s = n + max(0, x - 2);
        f.clear();
        for (int i = 2; i <= s / i; i++)
        {
            if (s % i == 0)
            {
                f.push_back(i);
                if (s / i != i)
                {
                    f.push_back(s / i);
                }
            }
        }
        f.push_back(s);
        for (auto v : f)
        {
            int t = (v + 2) / 2;
            if (t > 1 && t >= x && t * 2 - 2 == v)
            {
                se.insert(t);
            }
        }
    }
    cout << se.size() << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

D - Lonely Mountain Dungeons

解题思路:

首先,根据\(\sum c_i \leq 2 \times 10^5\),可以发现,我们可以枚举队伍的数量。最多有\(\sqrt{n}\)种不同的种族人数。

对于任意队伍数量\(i\),我们发现,每个种族的人尽量平均地分到每个队伍中是最优的。

手算规律可以发现,对于每个种族人数\(v\),给定要划分的队伍数\(i\),平均划分得到的最大对数是可以\(O(1)\)计算得到的。

时间复杂度\(O(n log(2\times10^5))\)。种族数量的根号均摊\(+\) \(map\)的\(log\)查找,时间复杂度不一定对,但大概不会超过这个\(O(n \sqrt{n})\)。

代码:

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define fi first
#define se second
using i128 = __int128_t;
using piii = pair<ll, pair<ll, ll>>;
ll qmi(ll a, ll b)
{
    ll res = 1;
    while (b)
    {
        if (b & 1)
        {
            res = res * a;
        }
        a = a * a;
        b >>= 1;
    }
    return res;
}
void solve()
{
    ll n, b, x;
    cin >> n >> b >> x;
    vector<ll> a(n + 1);
    ll ma = 0;
    map<ll, ll> cnt;
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
        ma = max(a[i], ma);
        cnt[a[i]]++;
    }
    map<ll, ll> cost;
    ll ans = 0;
    for (int i = 1; i <= ma; i++)
    {
        ll sum = 0;
        for (auto t : cnt)
        {
            ll x = t.fi / i;
            ll y = t.fi % i;
            ll res = (i - y) * (i - y - 1) / 2 * x * x;
            if (y > 0)
            {
                res += y * (i - y) * x * (x + 1);
            }
            if (y > 1)
            {
                res += (y * (y - 1)) / 2 * (x + 1) * (x + 1);
            }
            if (res > cost[t.fi])
            {
                cost[t.fi] = res;
            }
            sum += t.se * cost[t.fi] * b;
        }
        sum -= (i - 1) * x;
        ans = max(ans, sum);
    }
    cout << ans << endl;
}

int main()
{
    int t = 1;
    cin >> t;
    while (t--)
    {
        solve();
    }

    return 0;
}

标签:int,res,ll,Codeforces,long,using,Div,924,define
From: https://www.cnblogs.com/value0/p/18013484

相关文章

  • Codeforces Round 905 (Div. 3)
    题目链接A.先算距离,特判0的位置,最后加4#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=1e5+10;#defineinf0x3f3f3f3fvoidsolve(){strings;cin>>s;s=""+s;intlast=1,now,ans=0;for(inti=1;i<s.si......
  • Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)
    目录题目链接题意题解代码题目链接C.DigitalLogarithm题意给两个长度位\(n\)的数组\(a\)、\(b\),一个操作\(f\)定义操作\(f\)为,\(a[i]=f(a[i])=a[i]\)的位数求最少多少次操作可以使\(a、b\)两个数组变得完全相同题解性质:对于任何数,经过两次操作我们一定可以让其变为\(......
  • CodeForces 1286C2 Madhouse (Hard version)
    洛谷传送门CF传送门可以把限制看成\(0.75n^2\)。发现\(0.75n^2=0.5n^2+2\times0.5(\frac{n}{2})^2\)。这启发我们询问一次\([1,n]\)和两次长度为\(\frac{n}{2}\)的区间。不妨问\([1,n],[1,\frac{n}{2}],[1,\frac{n}{2}+1]\)试试。注意到把\([1,\frac......
  • Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)
    很意思的一道构造题题意:给一个\(n、k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)*n/2\),每个数的范围为\([-1000,1000]\)这种构造题可以考虑就是前一段可以一直用一样的、最小的。我们观察可以发现\(k+k-(n+1)*n/2=(n+1)*n/2\)也就是所有子数组......
  • CodeForces 1927G Paint Charges
    洛谷传送门CF传送门看到\(n\le100\)考虑\(O(\text{poly}(n))\)dp。发现从左向右决策,因为一个点可以向左或向右覆盖,所以需要记最靠左的未覆盖的位置\(j\)和最靠右的已覆盖位置\(k\),状态就是\(f_{i,j,k}\),dp最小的覆盖次数。转移的讨论很简单。考虑不覆盖还是向左......
  • Codeforces Round 919 (Div. 2)
    https://codeforces.com/contest/1920B还行,C、Egood(E据说是很典的dp但我是dp苦手),D、F1无聊,F2不会A.SatisfyingConstraints*800有\(n\)个条件,每个条件形如\(x\gek,x\lek\)或\(x\neqk\),\(k\)为整数。问满足条件的整数\(x\)的个数。先处理\(\ge,\le\),得到限制......
  • CF1863F Divide, XOR, and Conquer 题解
    简要题意你有两个指针\(l,r\)初始时\(l=1,r=n\)。你可以操作若干次知道\(l=r\)。每次操作你可以选择一个整数\(k\in[l,r)\),记\(x=\bigoplus_{i=l}^ka_i,y=\bigoplus_{i=k+1}^ra_i\)。如果\(x\leqy\),你可以令\(l=k+1\)。如果\(x\geqy\),你可以令\(r=k\)。......
  • Codeforces Round 923 (Div. 3)赛后总结
    CodeforcesRound923(Div.3)A没什么好说的,纯秒。B一开始不知道怎么做,后面用了一个比较麻烦复杂的思路,可以做,但是开数时漏了数组0下标,导致样例一部分一直是空的。C非常简单的一道题,判断条件也比较好找,但是再提醒一遍自己,数组开大点,应该数组开小了,导致样例8没过真的气,最后......
  • Codeforces Round 260 (Div. 1)A. Boredom(dp)
    最开始写了一发贪心wa了,然后这种选和不选的组合优化问题,一般是考虑动态规划\(dp[i][0]:\)表示第i个数不选的最大值\(dp[i][1]:\)表示第i个数选的最大值考虑转移:\(dp[i][0]=max(dp[i-1][1],dp[i-1][0])\)\(dp[i][1]=dp[i-1][1]+a[i]*i\)需要将每一个数用一个桶统计次数因......
  • Codeforces Round 923 (Div. 3)
    A.MakeitWhiteA题不多说B.FollowingtheString题目一开始没看懂,后面发现数字是指字母出现的次数,读懂题目后就好做了,先把26个字母放在一个数组里全部初始化为0,然后用1次就加1,然后要根据数字来选数的话就可以遍历数组当满足就break;也可以通过集合。C.ChoosetheDifferent......