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

Codeforces Round 885 (Div. 2)

时间:2023-08-01 21:15:58浏览次数:57  
标签:distance smax gcd 885 int 数对 Codeforces Div 2k

Codeforces Round 885 (Div. 2)

A. Vika and Her Friends

题目大意

太长了 click

思路

可以手动模拟一下,可以发现当两个人的 \(x+y\) 值就行相同的就能抓到了

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int n, m, k;
        cin >> n >> m >> k;
        bool flag = false;
        int a, b;
        cin >> a >> b;
        for (int i = 1; i <= k; i++)
        {
            int c, d;
            cin >> c >> d;
            if ((a + b - (c + d)) % 2 == 0)
                flag = true;
        }
        if (!flag)
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }
    return 0;
}

B.Vika and the Bridge

题目大意

有 \(n\) 块木板排成一排,第 \(i\) 块木板的颜色是 \(c_i\),你站在第一块木板前面,需要跳跃到第 \(n\) 块木板后面,每一次只能跳相同颜色的木板。现在你可以更改一块木板的颜色,使得你每一次跳跃的距离(指两块木板中间部分,不计两端点)的最大值最小,请求出这个值。

思路

首先我们知道一个结论,当一个点到另一个与它相同颜色的点的距离是最大的,那么,我们只要在中间插上一个与其颜色相同的点就能让最大长度的除以 2 。

我们考虑维护最大距离 \(fmax\) 和次大距离 \(smax\),最后统计 \(\min\{\max\{\frac{fmax_i}{2},smax_i\}\}\) 即可

int distance = i - last[a[i]] - 1;
if (distance > fimax[a[i]])
{
    smax[a[i]] = fimax[a[i]];
    fimax[a[i]] = distance;
}
else if (distance > smax[a[i]])
    smax[a[i]] = distance;
---------------------------------------
last[a[i]] = i;
int ans = 1e9 + 7;
for (int i = 1; i <= m; i++)
	ans = min(ans, max(smax[i], fimax[i] / 2));

C.Vika and Price Tags

题目大意

给定 \(n\) \((1≤n≤1×10^5)\) 对整数 \(a,b\) \(( 1≤a,b≤1×10^9 )\),每次使 \(a←b\),\(b←∣a−b∣\),求是否能实现让所有的 \(a\) 在有限次同步操作后都变为 \(0\)。

思路

这道题显然用到了“更相减损法”,既然是更相减损,那么就会想到词 \(\gcd\)

对于 \(a,b(a>b)\) 的最大公因数 \(\gcd(a,b)\), 有

\(\gcd(a,b)=\gcd(b,a-b)\)

在更相减损法的过程中 \(\gcd(a,b)\) 显然不变,最后使得 \(a=0\) ,此时 \(\gcd(a,b)\) 为 \(b\)

最终满足题目序列的序列的是这样的

\(0\) \(0\) \(0\) \(0\)
\(\gcd(a_1,b_1)\) \(\gcd(a_2,b_2)\) \(\gcd(a_3,b_3)\) \(...\)

我们只需要讨论所要的 \(\gcd(a_i,b_i)\) 能不能同时出现。

对于满足条件的数对 \((0,b)\) 在操作过程中的状态可能是 \((0,b),(b,b),(b,0)\) ,并在三种状态中有序循环

考虑简化,对于数对 \((a,b)\),在进行 \(k\) 此操作后可以形成 \((0,x)\) 满足条件的数对,那么对于数对 \((qa,qb)\) 可以在进行 \(k\) 次操作后,一定变成 \((0,qx)\) ,在所有操作中 \(q\) 可以当成公因数提出

同理,数对 \((a,b)\) 与 数对 \((\frac{a}{\gcd(a,b)},\frac{b}{\gcd(a,b)})\) 等价

接下来用互质给数对 \((a,b)\) 进行分类,当 \(a\) 与 \(b\) 互质时,会有

\(a\)
\(b\)

如何证明以上就是我们所需的三种分类呢?

设 \(a=2k,b=2k+1\)

\(a\) \(2k\) \(2k+1\) \(1\) \(2k\) \(2k−1\) \(1\) \(2k−2\) ...
\(b\) \(2k+1\) \(1\) \(2k\) \(2k−1\) \(1\) \(2k−2\) \(2k−3\) ...

发现数对 \((a,b)\) 总是在给出的三种情况反复循环

以奇奇,奇偶开始同理

所以我们证明了,数列能否合法,只与其间数对的奇偶性有关。如果数对的奇偶性有且仅有唯一的一种,那么就能成立。

int work(int x, int y)
{
    int gcc = gcd(x, y);
    x /= gcc, y /= gcc;
    if (x % 2 == 0)
        return 0;
    if (y % 2 == 0)
        return 1;
    return 2;
}
-------------------------------
for (int i = 1; i <= n; i++)
{
    if (a[i] == 0 && b[i] == 0)
        continue;
    res = work(a[i], b[i]);
    if (res == 0) sum0 = 1;
    if (res == 1) sum1 = 1;
    if (res == 2) sum2 = 1;
}

标签:distance,smax,gcd,885,int,数对,Codeforces,Div,2k
From: https://www.cnblogs.com/ljfyyds/p/17599084.html

相关文章

  • Codeforces Round 887 (Div. 2)
    CodeforcesRound887(Div.2)A.Desorting题目大意给出一个长度为\(n\)的数组\(a\),可以执行这个操作任意次。选择一下标\(i\),使得\(a_{1...i}\)加上\(1\),\(a_{i+1...n}\)减少\(1\)。问最少几次操作使得数组\(a\)无序。思路首先如果\(a\)原本就无序的......
  • Codeforces Round 885 (Div. 2) 题解
    A.VikaandHerFriends看一下样例就可以发现,Vika以及她的朋友都不能走对角线,在这种情况下Vika和朋友的距离为偶数,且朋友一定追不上Vika所以直接判断Vika和朋友的距离是否都为偶数即可B.VikaandtheBridge显然贪心,枚举颜色,找到相邻距离最大的两块木板,记该距离为\(......
  • Practice on Codeforces and Atcoder in May
    CF补题题解2023.5说明:CF题直接去luogu看翻译,AT题会附上简要题意CF1821E先考虑如何高速计算权值一个显而易见的贪心是尽量在右边取括号消除,设右括号为1,左括号为-1那么我们每一次消除的括号\(i,i+1\)都满足了\(i+1\)的右边剩下的全部是右括号,代价就是往右数的个数更进一......
  • Practice on Codeforces and Atcoder in June
    \(Practice\)\(on\)\(codeforces\)\(in\)\(June\)wk,误删了4个题,但我不想补了\(CF1839D\)题意:给一个正整数序列\(a\),给定\(k\)个0,将其放进序列的任意位置里,可以进行无限次操作,每次将一个挨着0的数移动到序列的任意位置,最后删掉所有的0,求使得序列变成递增序列的最小操作......
  • Practice on Codeforces and Atcoder in July
    \(1844E\)题意:定义一个矩形\(a\)是好的,当且仅当其满足以下条件:矩形中每一个元素\(x\)都为\(A,B,C\)其中之一每一个\(2\times2\)的子矩形都必须包含三个不同的字符共用一条边的两个元素不相等给定\(k\)个限制条件,限制条件分为两类:\((x,x+1,y,y+1)\),限制\(a[x......
  • Codeforces Round 887 (Div. 2) 题解
    A.Desorting题目的核心操作就是选定一个位置\(i\),使得:对于所有\(j\lei\),\(a_j\leftarrowa_j+1\)对于所有\(j>i\),\(a_j\leftarrowa_j-1\)这样一来,操作后\(a_{i+1}-a_i\)的值就会\(-2\)因为\(a_{i+1}-a_i<0\)时,也意味着\(a_i>a_{i+1}\),所以就达到了要求那么题......
  • Educational Codeforces Round 152 (Rated for Div. 2) D. Array Painting
    初始所有点都是蓝色的,给定一个数组,每个元素为0,1,2等值,两种操作,选定一个点花1元变红,或者选定一个为1或者2的红色点,减去一个价值,让周围的点变红,最后所有点都要变红思路:贪心,对于一个数组来说我们找寻连续的不等于0的一段,判断每一段最多所能变红的存在两种情况010,这种情况花1可以最......
  • Educational Codeforces Round 152 (Rated for Div. 2) C. Binary String Copying
    题目大意为给定一个01字符串,给定m个区间,对于每个区间进行一次局部排序,求能得到的字符串种类数解法:因为字符串只包含0,1两个字符,我们观察可以得到,对于不同的区间来说如果排序后一样则说明肯定是某些位置在排序过程中无贡献,因此我们只需找出有贡献的位置即可对于一个区间[l,r],来说......
  • Codeforces Round 888 (Div. 3)
    比赛链接:https://codeforces.com/contest/1851A.EscalatorConversations题意:一个扶梯,共m阶,n人站,每个台阶高k,Vlad身高H,Vlad任意站,问有多少人站在这个扶梯上正好和Vlad齐平满足abs(H-h[i])%k==0&&abs(H-h[i])/k<=m-1&&H!=h[i]即可B.ParitySort题意:给出......
  • Longest Divisors Interval
    Smiling&Weeping----总有一个人,一直住在心底,却消失在生活里。Givenapositiveintegern,findthemaximumsizeofaninterval[l,......