csp-非零段划分-差分前缀和-unique用法

2 篇文章 1 订阅
订阅专栏

问题描述:(贴图贴贴贴!)

问题分析:

对于暴力破解的方法不做过多描述: 202109-2 非零段划分_bulibuli蛋的博客-CSDN博客_非零段划分

前缀和 差分 可以先去这里面看看: 出行计划-差分前缀和_fz_orb的博客-CSDN博客

1.岛屿法解决问题:

考虑p足够大的情况,这时所有的岛都被海水淹没了,只有0个岛屿

然后海平面逐渐下降,岛屿数量开始变化

每当一个凸峰出现,岛屿数就会多一个;

每当一个凹谷出现,原本相邻的两个岛屿就被这个凹谷连在一起了,岛屿数减少一个

可以使用数组cnt[],cnt[i] 表示海平面下降到i时,岛屿数量的变化(++或者--)

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

附上图解:(这个图不是我画的) 找不到原来那个博主了 抱歉>>>>

1.1 源码:

/*
 id:图图就爱怼老师
 qq:q6-7212422
*/

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

    a[0] = a[n+1] = 0; //边界默认为0
    n = unique(a, a+n+2) - a; //去掉相邻重复元素
    for(int i=1; i<n-1; i++)
        if(a[i-1]<a[i] && a[i]>a[i+1])              //凸峰
            cnt[a[i]]++;
        else if(a[i-1]>a[i] && a[i]<a[i+1])         //凹谷
            cnt[a[i]]--;
    // 因去重,不存在等于左右情况
 
    int ans=0, sum=0;
    for(int i=10000; i>0; i--) {
        sum += cnt[i];                              //差分的后缀和即为答案
        ans = max(ans,sum);
    }
 
    printf("%d\n",ans);
}

1.2需要注意的地方:

关于unique函数:

 2.差分前缀和(有点抽象)

使用数组cnt[],cnt[i] 表示p从i-1上升到i时,非零段数量的变化
那么则有:

如果 a[i]>a[i−1]
意味着当p取到 a[i−1]+1 到 a[i]之间的值时,非零段数目+1 (首先因为两端都是0 一定会落回0,那么只要上升了就会冒出来至少一个山头) (脑袋里肯定有一个画面了)

现在把那个画面扔掉,去考虑数组上的画面:

对于一个a[i]>a[i-1]就会让一个区间的所有值+1 (理所当然 大声喊出来:差分-前缀和!!!!!)

那么对于所有的a[i] 就会出现一堆叠加的区间,那我们的答案不就是    最高的那个叠加区间嘛!!!!!

从 正向前缀和数组 中找出最大值就是所要的结果,而且 小有意思的是 这个前缀和数组 最后一定全部都是0 (因为 差分数组  左边界+1 就会对应右边界-1  到最后体现在前缀和上 最后的最后肯定都是一串0啦!)

总结说来就是p的选择使得cnt[]"连续"的1越来越多,也就是叠加的区间越来越高!

2.1源码:

#include <iostream>
using namespace std;
 
const int N = 500005;
const int M = 10000;
int a[N], cnt[N];
 
int main()
{
    int n, phrase = 0; // 整数个数,段数
    int i;
 
    cin >> n;
    for(i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        if(a[i] > a[i-1])
        {
            //差分,p取a[i-1]+1~a[i]的非零段数量加一
            cnt[a[i-1]+1]++;
            cnt[a[i]+1]--;
        }
    }
 
    int sum = 0;
    for(i = 1; i < M; i++)
    {
        sum += cnt[i];
        phrase = max(phrase, sum);
    }
 
    cout << phrase;
    return 0;
}

 还不懂的 再去看这个文章: 出行计划-差分前缀和_fz_orb的博客-CSDN博客

linux常用命令-part2
chinayuan的专栏
05-01 2万+
Ubuntu,Fedora,Debian,CentOS中文怎么发音 有奔头, 费德勒, 迪扁, 桑托斯。 乌版图 菲朵拉 德槟 森头斯 ================================ 使用find和wc命令统计代码行数 ================================ wc -l `find . -name "*.js" | xargs`
linux常用命令-part3
热门推荐
chinayuan的专栏
05-01 2万+
中文怎么发音 Ubuntu 有奔头,乌版图 Fedora 费德勒,菲朵拉 Debian 迪扁,德槟 CentOS 桑托斯 森头斯       Linux发展历史: 1) RedHat ---> 1.RedHat                2.CentOS                3.Fedora  桌面图形系统        rpm, yum 命令 2)
CSP202109-2 非零段划分 学习笔记 python(csdn)————程序.pdf
12-01
CSP202109-2 非零段划分 学习笔记 python(csdn)————程序
CSP-2非零段划分
qq_37464878的博客
02-24 681
暴力法: 复杂度为O(n*m),m是数列中最大数值,最大为104,n是数列元素个数,最大为5*105。 p的取值为[1, max(ar) +1]``````max(ar)指给出数列中最大的元素。 遍历p的所有取值,然后对于每个取值都去原数列中计算一下非零段个数。 这样遍历所有的p可能的取值,复杂度是O(m)。查询对应取值下非零段的数量的复杂度是O(n)。总复杂度是O(n*m)。 思路一:差分数列 复杂度为O(m2),m是数列中最大数值,最大为104。 p的取值为[1, max(ar) +1]````...
非零段划分(CSP202109-2)
m0_50435987的博客
10-04 3747
非零段划分 题目链接 题目描述:
csp非零段划分(结尾有不超时解题,直接跳转看)
@@老胡的博客
11-25 703
题目描述 A1,A2,⋯,An 是一个由 n 个自然数(非负整数)组成的数组。我们称其中 Ai,⋯,Aj 是一个非零段,当且仅当以下条件同时满足: 1≤i≤j≤n; 对于任意的整数 k,若 i≤k≤j,则 Ak>0; i=1 或 Ai−1=0; j=n 或 Aj+1=0。 下面展示了几个简单的例子: A=[3,1,2,0,0,2,0,4,5,0,2] 中的 4 个非零段依次为 [3,1,2]、[2]、[4,5] 和 [2]; A=[2,3,1,4,5] 仅有 1 个非零段; A=[0,0,0] 则不
csp202109-2】非零段划分c++100)
weixin_51305111的博客
02-23 663
当将一个非0数变为0时,如果它在头,右边是0,那就少一个非0段,右边不是0,那就多一个非0段;如果在中间,左右两边是否都为0或都不为0,情况同上。从202012开始的第2题都很注重空间换时间,这道题笨方法是会循环两遍的,1.0s肯定超时,那要思考之前求取的结果有没有用,怎么用。知道一个数的位置不一定非要遍历,我们可以把它记下来,用一个二维数组,纵坐标就是这个数,里面存的是这个数在这个数组中出现的位置。第一次只拿了50分,我看好多人拿的都是70分,结果一看,空间使用258.9MB,吓一跳,但思路没有错。
CCF-CSP 题解
m0_61040465的博客
05-25 469
CSP部分题题解
刷题记录(自己看的习题本)
H0pe__的博客
09-15 569
【代码】刷题记录。
程序员编程笔记
weixin_40789007的博客
09-20 4671
1.查看电脑当前进程和端口cmd netstat -pid netstat -a 查看全部端口信息:netstat –ano 2.创建文件夹 mkdir 文件名或文件路径 3.删除文件夹 rmdir 4.删除文件 del 5.打开计算机calc 6.打开画图mspaint 7.用echo "写入新数据">d:\a.txt,echo 字符串 >文件路径 文件名(会覆盖原内容) 8.用echo "写入新数据">>d:\a.txt,echo 字符串 >文件路径 文件名.
CSP-202109-2-非零段划分
fzy2003的博客
03-01 1018
因此,整个程序的总时间复杂度为 O(maxElem * n),这里 maxElem 是数组中的最大值,n 是数组的长度。这段代码的目的是在给定一个由自然数(非负整数)组成的数组后,通过选择一个适当的正整数 p,将数组中所有小于 p 的数变为 0,从而使得数组中非零段的数量达到最大。一个非零段开始于一个非零元素,该元素要么是数组的第一个元素,要么其前一个元素为零。在每一个 p 的值下,我们又对数组进行了两次遍历(一次是将小于 p 的值置为 0,另一次是计算非零段的数量),每次遍历的时间复杂度为 O(n)。
CSP试题回顾】202109-2-非零段划分(优化)
最新发布
fzy2003的博客
03-25 604
在解决特定子序列计数问题中,差分数组技术被用来标记数列中的“峰”和“谷”。首先,通过处理输入并去除重复元素,准备数列数据。然后,构建一个差分数组来记录数列中每个元素相对其相邻元素的变化。对于数列中的每个局部最大值(“峰”),在差分数组对应位置减一;对于每个局部最小值(“谷”),在差分数组对应位置加一。最后,通过遍历差分数组,累加变化量,来找出满足条件的子序列总数。这种方法能有效处理数列的区间更新问题,适用于快速计算出数列中满足特定条件的子序列数量。
CCF CSP 202109-2 非零段划分
baodream的博客
03-04 838
CCF CSP 202109-2 非零段划分 试题编号: 202109-2 试题名称: 非零段划分 时间限制: 1.0s 内存限制: 512.0MB 题目描述 输入格式 输出格式 样例1输入: 11 3 1 2 0 0 2 0 4 5 0 2 样例1输出: 5 样例1解释: p=2时,A=[3,0,2,0,0,2,0,4,5,0,2],5个非零段依次为[3]、[2]、[2]、[4,5] 和 [2],此时非零段个数达到最大。 样例2输入: 14 5 1 20 10 10 10 10 15 10
CSP 2021-09-2 非零段划分
qq_50262274的博客
10-04 1094
先附上队友的题解,u1s1队友不会是因为给我讲题多了逻辑这么清晰了吧 因为本人较菜,看到这题就想起了亚特兰蒂斯? 说白了这题思路就是一个裸的扫描线,可以从上往下扫描根据峰值来更新区间个数(详见队友博客或队内dalao给我对拍的代码,咳咳 #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> #include<map
csp 202109-2 非零段划分
m0_53372931的博客
09-12 570
csp 202109-2 非零段划分
csp2021-09-2 非零段划分
若宸的博客
03-06 2733
CSP真题解 非零段划分 文章目录CSP真题解 非零段划分前言一、70分,超时二、差分思想前缀和差分差分是什么 前言 一、70分,超时 #include <iostream> #include <algorithm> #include <bits/stdc++.h> using namespace std; const int N = 15; int a[N], b[N],c[N]; int main() { int n,nmax=0,mmax=0,
csp非零段划分
heliotrope_jin的博客
09-08 257
csp第二题
CSP非零段划分
weixin_50953388的博客
11-14 379
差分应用
NOIP学习指南:阶段进阶与CSP-J/CSP-S备考策略
本资源是一份关于2020年CSP-J和CSP-S比赛的注意事项文档,发布于2021年10月8日,旨在帮助参赛者提高在NOIP竞赛中的表现。文档强调了几个关键点以取得好成绩: 1. 系统学习和实践:推荐使用教材如《一本通》、《训练...
写文章

热门文章

  • 微机原理与接口技术课内实验-NUAA-Masm for Windows 4505
  • Python 搞懂Logger模块让老板刮目相看 3540
  • 2024(20级)计算机保研经验贴-厦门大学and东南大学and西交软(弱弱无六级菜鸡求学路) 2644
  • 微机原理与接口技术-NUAA-课内实验报告 1775
  • NUAA-云计算-考试 1717

分类专栏

  • Suricata源码分析 3篇
  • NUAA 4篇
  • NUAA-泛在网 4篇
  • NUAA-云计算 1篇
  • NUAA物联网控制技术 1篇
  • NUAA-编译原理 2篇
  • NUAA-微机原理接口与技术 2篇
  • for_myself 12篇
  • Python 3篇
  • JAVA 1篇
  • OpenCV 1篇
  • QT入坑到去世 1篇
  • csp+算法 2篇
  • MySQL+Premium+maven

最新评论

  • Pycharm 和虚拟环境的那些事?

    CSDN-Ada助手: 推荐 Python入门 技能树:https://edu.csdn.net/skill/python?utm_source=AI_act_python

  • Pycharm 和虚拟环境的那些事?

    CSDN-Ada助手: 恭喜你这篇博客进入【CSDN每天值得看】榜单,全部的排名请看 https://bbs.csdn.net/topics/619179570。

  • 2024(20级)计算机保研经验贴-厦门大学and东南大学and西交软(弱弱无六级菜鸡求学路)

    不买Huracan不改名: 就在九龙湖校区

  • 2024(20级)计算机保研经验贴-厦门大学and东南大学and西交软(弱弱无六级菜鸡求学路)

    hold?study:games: “你只要使用一些xxxx,然后就能优营了,你懂的~” 这是啥啊,多跟老师联系吗?

  • 2024(20级)计算机保研经验贴-厦门大学and东南大学and西交软(弱弱无六级菜鸡求学路)

    m0_61874187: 想问一下,软件学院搬到南京哪了啊。

大家在看

  • 酒吧收银系统解决方案——未来之窗行业应用跨平台架构 528
  • 精通CSS布局:探索经典的网页布局样式和技术 160

最新文章

  • Pycharm 和虚拟环境的那些事?
  • VSCode编译调试Suricata
  • Suricata-入门实验-快速理解suricata
2024年6篇
2023年16篇
2022年15篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家拱墅区玻璃钢雕塑方案虹口商场美陈杭州市湖州商场美陈布置工厂昆山玻璃钢花盆花器清远玻璃钢动物雕塑怎么样玻璃钢雕塑厂家咨询河南公园玻璃钢雕塑生产厂家南充玻璃钢动物雕塑哪里有玻璃钢雕塑设计厂家十堰玻璃钢考拉雕塑公司吉林抽象玻璃钢雕塑多少钱贵州玻璃钢草莓雕塑价格园林玻璃钢卡通雕塑报价表河北周年庆典商场美陈怎么样绩溪玻璃钢雕塑厂家河南玻璃钢果蔬雕塑台州玻璃钢雕塑价格宜春市玻璃钢雕塑宁夏玻璃钢广场雕塑价格周口制作玻璃钢雕塑厂报价单浙江节庆商场美陈黑龙江步行街玻璃钢雕塑哪家便宜羽毛玻璃钢雕塑厂深圳水果玻璃钢雕塑定做价格玻璃钢雕塑损坏广东玻璃钢孙悟空雕塑厂家玻璃钢雕塑产品技术指标说明绍兴玻璃钢牌匾雕塑顺义区精神堡垒制作玻璃钢雕塑上海美陈商场价格香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化