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

Codeforces Round 885 (Div. 2)

时间:2023-07-18 17:12:32浏览次数:33  
标签:885 int res Codeforces long cin -- solve Div

A. Vika and Her Friends

枚举所有的点,判断是否存在点与Vika的距离和其他 k 个人的距离的奇偶性不同。

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int mod = 998244353;

void solve() {
    int n, m, k, sx, sy;
    cin >> n >> m >> k >> sx >> sy;
    vector<int> x(k), y(k);
    for (int i = 0; i < k; i++)
        cin >> x[i] >> y[i];
    for (int i = 1, p, f; i <= n; i++)
        for (int j = 1; j <= m; j++) {
            p = (abs(i - sx) + abs(j - sy)) % 2, f = 1;
            for (int l = 0; f && l < k; l++) {
                int q = (abs(i - x[l]) + abs(j - y[l])) % 2;
                if (p == q) f = 0;
            }
            if (f) {
                cout << "YES\n";
                return;
            }
        }
    cout << "NO\n";
    return;
}

int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

B. Vika and the Bridge

预处理出所有的数出现的位置,然后枚举数,找到最大的间隔在间隔的最中间的位置插入一个,然后在统计出最大间隔即可。所有数字的最大间隔最小就是答案。

#include <bits/stdc++.h>

using namespace std;

#define int long long

const int mod = 998244353;

void solve() {
    int n, k;
    cin >> n >> k;
    vector<vector<int>> a(k + 1, vector<int>(1, 0));
    for (int i = 1, x; i <= n; i++)
        cin >> x, a[x].push_back(i);
    for (int i = 1; i <= k; i++)
        a[i].push_back(n + 1);
    int res = INT_MAX;
    for( const auto & v : a ){
        multiset<int> s;
        for( int i = 1 ; i < v.size() ; i ++ ){
            s.insert( v[i] - v[i-1] - 1);
            if( s.size() > 2 ) s.erase( s.lower_bound(*s.begin()) );
        }
        if( s.empty() ) continue;
        int x = (*s.rbegin());
        s.erase(s.lower_bound(x));
        x -- , s.insert( x/2 ) , s.insert( (x+1) / 2 );
        res = min( res , *s.rbegin());
    }
    cout << res << "\n";
    return;
}

int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int t;
    cin >> t;
    while (t--)
        solve();
    return 0;
}

C. Vika and Price Tags

我们只看一对数,当出现了某个数为0 的情况时,就会开始一个大小为 3 的循环。

所以我们要计算第一次\(a\)变为\(0\)需要消耗次数,模三后如果所有的答案都相同则输出YES

显然我们不可以去暴力的计算消耗次数,但是发现\(a>2b\)时,会出现\((a,b)->(b,a-b)->(a-b,a-2b)->(a-2b,b)\)刚好也是三次,所以可以直接对\(2b\)取模就可以快速变小。

#include <bits/stdc++.h>

using namespace std;

#define int long long

void solve() {
    int n;
    cin >> n;
    vector<int> a(n), b(n);
    for (auto &i: a) cin >> i;
    for (auto &i: b) cin >> i;
    for (int i = 0, t, c, last = -1; i < n; i++) {
        if (a[i] == 0 && b[i] == 0) continue;
        t = 0;

        while (a[i] != 0) {
            if (b[i] != 0 && a[i] > 2 * b[i]) a[i] %= 2 * b[i];
            else c = abs(a[i] - b[i]), a[i] = b[i], b[i] = c, t = (t + 1) % 3;
        }
        if (last == -1) last = t;
        else if (last != t) {
            cout << "NO\n";
            return;
        };
    }
    cout << "YES\n";
}

int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

D. Vika and Bonuses

很显然,可以想到一定是先执行s+=s%10,再求和。

我们仅看个位数,发现

\[0\rightarrow 0\\ 2 \rightarrow 4 \rightarrow 8 \rightarrow6\rightarrow2 \]

\(0\)没有变化,其他偶数在进行大小为\(4\)的循环,且一个循环可以增加\(20\)

再看其他情况

\[1\rightarrow2\\ 3\rightarrow6\\ 5\rightarrow0\\ 7\rightarrow4\\ 9\rightarrow8\\ \]

只要走一步,要么是\(0\),要么进入循环。

假设我们一开始先操作\(y=4x+i,i\in\{0,1,2,3\}\)

则总和为\(s’\times(k-y)\)。其中\(s’\)是操作\(x\)次后的结果,会发现大致符合单峰函数,似乎可以进行三分,但是样例就会发现不是完全符合三分的。

但是如果\(s’\)是操作\(i\)次后结果,则总和为\((s’+20x)-(k-4x-i)\)当\(i\)固定时,完全满足三分。所以可以枚举\(i\)然后三分\(x\)即可。

#include <bits/stdc++.h>

using namespace std;

#define int long long

void solve() {
    int s, k, res;
    cin >> s >> k;
    res = s * k;

    s += s % 10, k--;
    res = max(res, s * k);

    if (s % 10 != 0) {
        auto f = [s, k](int x) {
            if (x > k) return 0ll;
            int a = k - x, b = s;
            b += (x / 4) * 20ll, x %= 4ll;
            while (x--) b += b % 10;
            return a * b;
        };
        for (int i = 0, l, r; i < 4; i++) {
            l = 0, r = (k - i) / 4;
            for (int lm, rm, fl, fr; r - l >= 10;) {
                lm = l + (r - l + 1) / 3, rm = r - (r - l + 1) / 3;
                fl = f(4 * lm + i), fr = f(4 * rm + i);
                res = max({res, fl, fr});
                if (fl == fr) l = lm + 1, r = rm - 1;
                else if (fl < fr) l = lm + 1;
                else r = rm - 1;
            }
            for (int j = l; j <= r; j++)
                res = max(res, f(4 * j + i));
        }
    }
    cout << res << "\n";
}

int32_t main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while (T--)
        solve();
    return 0;
}

标签:885,int,res,Codeforces,long,cin,--,solve,Div
From: https://www.cnblogs.com/PHarr/p/17563497.html

相关文章

  • 【2023.07.14】Atcoder:past201912 - 第一回 アルゴリズム実技検定(div4+区域赛难度)过题
    G-Division解法一:位运算+状压枚举(赛时思路)范围显然,可以跑\(2^n\)的算法,考虑位运算状态压缩。以\(\mathcalO(2^n\cdot2^n)\)的复杂度分别枚举位于第一组、第二组中的人,随后计算每一种分组的快乐值,代码较长,赛时敲了半个小时,不过好在一发过了。总结:其实代码里面的剪枝完......
  • KL-Divergence KL散度
    KL散度(KL-divergence)直观解释:KL散度是一种衡量两个分布(比如两条线)之间的匹配程度的方法。需要解决的问题:已知数据太大,逍遥使用较小的信息表示已知数据。用某种已知分布来表示真实统计数据,这样我们就可以只发送该分布的参数,而无需发送真实统计数据。KL-divergence的作用:衡量每......
  • CodeForces 1848E Vika and Stone Skipping
    洛谷传送门CF传送门感觉比这场的F简单。发现我们要进行\(x\)不断乘一些数然后求答案的操作,猜测答案与\(x\)的因数有关。如果你对数字比较敏感,不难发现答案就是\(x\)的奇因子个数。官方题解的证明:设\(x=f+(f-1)+\cdots+(f-(c-1))\),由等差数列求和公......
  • 内置方法之divmod
    内置方法之divmod内置函数divmod(x,y)用于执行整数除法和取模运算,并返回一个包含商和余数的元组。参数x和y是两个数字其中x是被除数y是除数。以下是divmod()函数的使用示例:result=divmod(9,2)print(result)#输出(4,1)result=divmod(14,3)print(resu......
  • Codeforces Round 885 (Div. 2) A-D
    A.VikaandHerFriends题意:有一个n*m大小的矩阵,vika在点(a,b),她的k个朋友在分别(xi,yi),所有人每分钟都可以上下左右走一格,每一分钟vika先走,她的朋友后走,不能不走,问vika能否躲过朋友。Solution结论题,只要有一个朋友和她的距离是奇数,那么她肯定会被追上。voidsolve(){ int......
  • Codeforces Round #885(Div. 2)C
    C.维卡和价格标签每个测试的时间限制为1秒每个测试的内存限制为256兆字节输入:标准输入输出:标准输出维卡来到她最喜欢的化妆品店"GoldenPear"。她注意到n个物品的价格自她上次光顾以来发生了变化。她决定分析价格的变化,并计算每个物品的旧价格和新价格之间的差异。维卡喜......
  • Codeforces Round #885 (Div.2) Editorial
    B-VikaandtheBridge题意:从桥的一边走到另一边,每次只能踩在相同颜色的木板上,并且有一次操作,可以修改期中一个模板的颜色。问那种走法,跨过模板的最大值最小。思路:首先可以统计出选择每种颜色的,跳过木板的的个数,如果不能修改颜色,那么答案一定是每个颜色所对应的最大值的最小......
  • Codeforces Round 883 (Div. 3)
    只写部分题目。A.RudolphandCuttheRope#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongconstintN=2e5+5;intt,n,a[N],b[N];signedmain(){ cin>>t; while(t--){ cin>>n; intres=0; for(inti=......
  • CodeForces 1844C Particles
    洛谷传送门CF传送门原题是[ARC092E]BothSidesMerger。Keyobservation:每个元素的下标奇偶性不改变。于是讨论最后一个数是下标为奇数还是偶数加起来的数。将下标奇偶性相同的元素分开考虑。对于下标奇偶性相同的元素,不难发现答案的上界是所有\(>0\)的元素之和(没有\(>......
  • Educational Codeforces Round 33 (Rated for Div. 2)
    EducationalCodeforcesRound33(RatedforDiv.2)https://codeforces.com/contest/893昨日vp,今日补完FD贪心,思路值得学习;E组合数学推式子,式子不难,关键在于模型抽象F主席树,调了老半天,关键在于要理解查询函数的含义,确定什么时候能返回。A.ChessForThree居然卡了快十分......