首页 > 编程语言 >CCF 202109-2 非零段划分(C++)差分法

CCF 202109-2 非零段划分(C++)差分法

时间:2022-08-27 13:02:18浏览次数:49  
标签:int 岛屿 差分法 C++ 非零段 202109 ans CCF

image

借用岛屿情况来分析这个题。考虑p足够大的情况,所有的数都被海水淹没了,只有 0 个岛屿。然后,海平面逐渐下降,岛屿数量出现变化。每当一个凸峰出现,岛屿数就会多一个;每当一个凹谷出现,原本相邻的两个岛屿就被这个凹谷连在一起了,岛屿数减少一个。使用数组cnt[]cnt[i] 表示海平面下降到i时,岛屿数量的变化。

差分法是最简洁的解题程序。数组元素d[i]中存储该元素被替换为0时,划分数变化的差分值。最大值则只需要从其前缀和(程序中实际为后缀和)中找出最大值就是所要的结果。

#include<iostream>
#include<bits/stdc++.h>

using namespace std;

const int N = 500000;
const int M = 10000;
int a[N+2], d[M+1];

int main()
{
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
    }
    a[0] = a[n+1] = 0;

    // unique 去除相邻重复的元素,并把他们移动到末尾
    // n 为相邻不重复时的数组长度,从0到n,不包括n
    n = unique(a, a+n+2)-a;

    memset(d, 0, sizeof d);

    for (int i = 1; i < n-1; i++){
        if (a[i-1] < a[i] && a[i] > a[i+1]){
            d[a[i]]++;
        }else if (a[i-1]>a[i] && a[i]<a[i+1]){
            d[a[i]]--;
        }
    }

    int ans = 0, sum = 0; //差分前缀和即为答案
    for (int i = M; i >= 1; i--){
        sum += d[i], ans = max(ans, sum);
    }

    cout << ans << endl;

    return 0;
}

标签:int,岛屿,差分法,C++,非零段,202109,ans,CCF
From: https://www.cnblogs.com/understanding-friends/p/16630372.html

相关文章

  • 褶积方法制作合成地震记录c++
    地震褶积方法制作合成地震记录包括,(1)读取相模型,设置每种相的密度和速度,(2)计算反射系数,添加噪音,(3)设置子波,(4)进行褶积计算。具体的代码如下voidsyntheticSeis(conststring&......
  • C++停车场管理系统
    C++停车场管理系统停车场管理系统简介一、 问题描述设停车场是一个可停放若干辆辆汽车的狭多层平面区域,且只有一个大门可供汽车进出。若车场内已停满汽车,则后来的汽车只......
  • CCF 202112-2 序列查询新解(C++)
    该题关键点在于:分段计算先对f分段:for(inti=1;i<=n+1;i++)//以f(i)为区域划分计算在此区域内f的取值相同,值为:i-1。再对每个f值相同的区域按照g值进行分段:for(int......
  • C++基础-理解new和delete
    intmain(intargc,charconst*argv[]){ //C风格 int*p=(int*)malloc(sizeof(int)); if(p==NULL){ return-1; } *p=20;//初始化 free(p); int*q=(......
  • C++之多态
    C++之多态1静态联编和动态联编C++支持编译时多态(静态多态)和运行时多态(动态多态)。运算符重载和函数重载就是编译时多态,而派生类和虚函数就是运行时多态。静态多态和动态......
  • C++:理论基础篇
    class类特性封装:多态:继承:工厂函数 const与#define的区别const用来定义常量、修饰函数参数、修饰函数返回值,可以避免被修改,提高程序的健壮性define是宏定义,在......
  • C++课程设计题
    C++课程设计题题目列表:一、简单计算器的设计问题描述简单计算器的基本功能如下:四则运算,例如加减乘除等;除了整数的运算也可实现小数的各类运算;判断非法操作,例如判定......
  • Xmake v2.7.1 发布,更好的 C++ Modules 支持
    Xmake是一个基于Lua的轻量级跨平台构建工具。它非常的轻量,没有任何依赖,因为它内置了Lua运行时。它使用xmake.lua维护项目构建,相比makefile/CMakeLists.txt,配置语......
  • c++实现通讯录管理系统
    利用C++来实现一个通讯录管理系统系统中需要实现的功能如下:添加联系人:向通讯录中添加新人,信息包括(姓名、性别、年龄,联系电话、家庭住址)最多记录1000人显示联系人:显......
  • 关于c++的一些好玩的
    #defineA(x) #x:将x转换为字符串。#defineA(x) va##x:将x拼接在变量名后。next_permutation(a+1,a+n+1):把a数组变成字典序下一位,最大则变成最小的。random_s......