首页 > 编程语言 >2024牛客寒假算法基础集训营4个人补题题解(B、E)

2024牛客寒假算法基础集训营4个人补题题解(B、E)

时间:2024-02-24 21:24:04浏览次数:42  
标签:const int 题解 sum 石子 long 补题 数组 集训营

B、左右互博

不能操作的情况有且仅有所有石子堆的石子个数只有1的时候,因此不管途中怎么操作,让所有石子堆都变成1的总操作次数是确定的。
即假设一共有\(n\)堆石子,石子总数为\(sum\),总操作次数为\((sum-n)\)次。
因此当\((sum-n)\)%\(2=0\)时一定在sweet操作完(或没有操作)后gui无法操作,sweet胜利;反之gui胜利。
时间复杂度:\(O(n)\)

c++ ac代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+10;
const int inf=1e18;
const int M=1e9+7;
int a[N];
signed main() {
    int n;
    int cnt=0;
    cin >>n;
    for(int i=1;i<=n;i++)
    {
        cin >>a[i];
        cnt+=a[i];
    }
    if((cnt-n)%2==0)
        cout<<"sweet"<<'\n';
    else cout<<"gui"<<'\n';
    return 0;
}

E、漂亮数组

只要一段内出现过相加为\(k\)的倍数连续段,就直接在那段后面分割即可保持数量最大,那现在的问题就是如何去判断某段内有没有出现过相加和为\(k\)的倍数的连续段。
用\(sum\)数组记录数组前缀和,变量\(now\)记录当前隔板(即上一次分割的位置),如果在当前段中出现了模\(k\)的相同值或者本身这一段的和就是\(k\)的倍数,就说明出现了相加为\(k\)的倍数的连续段,一段内的模\(k\)值可用\(map\)记录。分割完更新隔板位置,继续往后判断即可。
因为题意问的是分割后的漂亮数组数量,那就不用管其他多余段的情况,因为分割了多少刀本质上就是分出了多少个漂亮数组。
时间复杂度:\(O(nlogn)\)

c++ ac代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6+10;
const int inf=1e18;
const int M=1e9+7;
map<int,int> mp;
int a[N];
int sum[N];
signed main() {
    int n,k;
    cin >>n>>k;
    for(int i=1;i<=n;i++)
    {
        cin >>a[i];
        sum[i]=sum[i-1]+a[i];
    }
    int now=0;
    int ans=0;
    for(int i=1;i<=n;i++)
    {
        if(mp[(sum[i]-sum[now])%k]!=0||(sum[i]-sum[now])%k==0)
        {
            ans++;
            mp.clear();
            now=i;
        }
        else
            mp[(sum[i]-sum[now])%k]++;
    }
    cout<<ans<<'\n';
    return 0;
}

标签:const,int,题解,sum,石子,long,补题,数组,集训营
From: https://www.cnblogs.com/ritsuki27/p/18031596

相关文章

  • CF1832B Maximum Sum 题解
    【题目描述】给定一个长度为\(n\)的数列,其中每个元素互不相同,进行\(k\)次操作,每次可以选择删除序列中最小的两个数或最大的一个数。求操作后剩余数的和的最大值。【思路】我们构造一组数据:首先我们看到题目中的一句话:每次可以选择删除序列中最小的两个数或最大的一个数。......
  • CF1857B Maximum Rounding 题解
    题目描述给定一个自然数\(n\),可以对任意一位进行四舍五入,可以进行任意次,求能得到的最大数。(这里的\(n\)没有前导零)思路首先我们发现,如果我们将其中一位进位了,那后面的所有位都会变成\(0\),因此,如果我们进位了两次,那么位置靠后的那次进位,其实是没有用的。所以我们要从高位往......
  • CF1857G Counting Graphs 题解
    题目描述给定一棵最小生成树,求有多少张图的最小生成树是给定的树,并且这张图的所有边边权不超过\(S\)。思路考虑在最小生成树中加边。我们回顾一下Kruskal的过程:找到没被用过的,最小的边判断这条边的两端是否在一个联通块中加入这条边,将两端的联通块连在一起根据第三条......
  • P9562 [SDCPC2023] G-Matching 题解
    题目描述给定长度为\(n\)的整数序列\(a_1,a_2,\cdots,a_n\),我们将从该序列中构造出一张无向图\(G\)。具体来说,对于所有\(1\lei<j\len\),若\(i-j=a_i-a_j\),则\(G\)中将存在一条连接节点\(i\)与\(j\)的无向边,其边权为\((a_i+a_j)\)。求\(G\)的一个......
  • CF1832B Maximum Sum 题解
    【题目描述】给定一个长度为\(n\)的数列,其中每个元素互不相同,进行\(k\)次操作,每次可以选择删除序列中最小的两个数或最大的一个数。求操作后剩余数的和的最大值。【思路】我们构造一组数据:首先我们看到题目中的一句话:每次可以选择删除序列中最小的两个数或最大的一个数。......
  • 2024牛客寒假算法基础集训营3
    2024牛客寒假算法基础集训营3A 智乃与瞩目狸猫、幸运水母、月宫龙虾题意给出若干组字符串,判断无视大小写,判断首字母是否相同思路如果首字母相同,则直接用\(==\)比较即可,如果首字母只有大小写的区别,则ASCII码值相差\(32\)代码/*******************************|Author:......
  • P4569 [BJWC2011] 禁忌 题解
    题目传送门前置知识AC自动机|矩阵加速递推解法对于一段固定的文本串,由于重叠的模式串不对伤害产生贡献,故考虑贪心,每碰到出现一个模式串将其分为一段,最终这个文本串的伤害就是划分次数。类似luoguP3193[HNOI2008]GT考试,令\(f_{i,j}\)表示前\(i\)个字符,当前运行到......
  • AT_abc341_g [ABC341G] Highest Ratio 题解
    题目传送门前置知识单调栈简化题意给定一个长度为\(n\)的序列\(a\)。对于所有的\(l(1\lel\len)\),均求出\(\max\limits_{r=l}^{n}\{\frac{\sum\limits_{i=l}^{r}a_{i}}{r-l+1}\}\)。解法令\(sum_{i}=\sum\limits_{j=1}^{i}a_{j},P_{i}=(i,sum_{i})\),则有\(\beg......
  • P10139 [USACO24JAN] Nap Sort G 题解
    DescriptionBessie正在尝试使用她自己的排序算法对一个整数数组进行排序。她有一堆共\(N\)(\(1\leN\le2\cdot10^5\))个整数\(a_1,a_2,\ldots,a_N\)(\(1\lea_i\le10^{11}\)),她将会按排序顺序将这些数放入一个单独的数组中。她反复查找这堆数中的最小数,将其删除,同时将其添加到......
  • UOJ228/HDU5828 基础数据结构练习题/Rikka with Sequence 题解(势能线段树)
    势能线段树。如果线段树上一个节点的\(\max-\min\ge2\),我们称其为关键节点,考虑定义势能\(\phi\)为线段树上关键节点的个数。对于每次开方操作,如果当前节点为关键节点,则暴力递归左右儿子修改,否则:如果当前节点\(\max=\min\)或\(\max=\min+1\)且\(\max\)不是完全平方数,......