C. Klee in Solitary Confinement(2021 南京 ICPC)

C. Klee in Solitary Confinement

观察题目,发现暴力枚举区间不可行。
考虑一个经典套路:独立处理每个数字(考虑一个数字作为众数的时候,只有x和x-k会对答案造成影响,其他是不用考虑的)


于是,考虑把每个数字作为众数
下面是一个样例
1 2 2 3 5     k=2
枚举:
当3作为众数的时候,只有1(3-k)和3本身会对答案造成影响
然后还有一个经典的套路是贡献法
原数列其实就可以堪称
1 0 0 -1 0      (b序列)
意思就是说,如果选了1,等于贡献加一(多了一个三)
如果选了3,贡献就减一(少了一个3----3变成5了)
所以说,实质上,我们就是在求b序列的最大连续区间和

另外对于复杂度来说,我们是对每个数字分别处理,
比如说众数为2的时候,就只考虑2和0的位置有哪些,其他位置是不会对这个造成影响的
然后再考虑一下,每个数字实质上跑了两次(删除一次,增加一次)
所以实质上的复杂度就是(2*P),或者说(3*P-4*P)---(这个要看具体写法了,因为有的时候可能会出现重复的情况)

接下来就到了分岔口了
P的具体时间复杂度是多少呢

1.我的方法是使用一个线段树
该种方法P=nlogn
我当时没想到2那种O(n)的方法,套了一个可以对任意区间求最大连续字段和并可以修改数值的板子,大概是GSS3
当时忘记了这道题的区间是1-n随便取了

2.我昨晚还想到一种方法是类似跑一个长度无限大的滑动窗口,或者说小dp,查询一下最大连续字段和即可(就是dp)
注意:需要注意操作方式
比如说对3为众数,那得到遍历的数组实质是是一个
1 -1 (实质数组),这样才能保证复杂度是O(n)
该种方法P=n

3.方法其实很多,官方题解我还没看,但空气力学是用的归并来维护的这个最大连续子段和的,只要会归并就容易看懂,且前置思路就是我上面的说法

4.还有一种前缀和的方法,感觉挺牛的,推式子推出来的,建议看看
https://blog.csdn.net/weixin_51934288/article/details/127087648
 

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define endl '\n'
const int N=2e6+10;
int a[N];
#define lc (u<<1)
#define rc ((u<<1)|1)
struct Tree{int lans,rans,sum,ans;
}tr[N*4];
int n,k;
#define mid ((l+r)>>1)
vector<int> cnt[2000000+10];
void pushup(int x){tr[x].sum = tr[x << 1].sum + tr[(x << 1) | 1].sum;tr[x].lans = max(tr[x << 1].lans, tr[x << 1].sum + tr[(x << 1) | 1].lans);tr[x].rans = max(tr[(x << 1) | 1].rans, tr[(x << 1) | 1].sum + tr[x << 1].rans);tr[x].ans = max(max(tr[x << 1].ans, tr[(x << 1) | 1].ans), tr[x << 1].rans + tr[(x << 1) | 1].lans);
}
void update(int u,int l,int r,int x,int k){if(l==r){tr[u].sum=tr[u].lans=tr[u].rans=tr[u].ans=k;return;}if(x<=mid) update(lc,l,mid,x,k);else update(rc,mid+1,r,x,k);pushup(u);
}
void build(int u,int l,int r){if(l==r){tr[u].rans=tr[u].sum=tr[u].ans=tr[u].lans=0;return;}build(lc,l,mid);build(rc,mid+1,r);pushup(u);
}
Tree query(int u,int l,int r,int x,int y){if(x<=l&&r<=y){return tr[u];}if(y<=mid) return query(lc,l,mid,x,y);if(x>mid) return query(rc,mid+1,r,x,y);else{Tree ans,a,b; a=query(lc,l,mid,x,y),b=query(rc,mid+1,r,x,y);ans.sum = a.sum + b.sum;ans.ans = max(max(a.ans, a.rans + b.lans), b.ans);ans.lans = max(a.lans, a.sum + b.lans);ans.rans = max(b.rans, b.sum + a.rans);//合并答案return ans;} 
}
signed main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>k;//for(int i=1;i<=n;++i) cin>>a[i];for(int i=1;i<=n;++i){int x;cin>>x;cnt[x+1000000].push_back(i);a[x+1000000]++;}build(1,0,2e6);int ans=0;for(int i=-1e6;i<=1e6;++i){int now=i+1e6;ans=max(ans,a[now]);//int w=cnt[now].size();//int ww=cnt[now-k].size();if(!a[now]||!((now-k>=0)&&(now-k<=2e6)&&a[now-k])||k==0) continue;if(a[now]||((now-k>=0)&&(now-k<=2e6)&&a[now-k])){//来自与now和now-kif(now-k>=0&&(now-k<=2e6)){//cout<<now-k<<endl;for(auto t:cnt[now-k]){update(1,0,2e6,t,1);}}for(auto t:cnt[now]){update(1,0,2e6,t,-1);}int q=query(1,0,2e6,0,2e6).ans;ans=max(q+a[now],ans);if(now-k>=0&&(now-k<=2e6)){for(auto t:cnt[now-k]){update(1,0,2e6,t,0);}}for(auto t:cnt[now]){update(1,0,2e6,t,0);}}}cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/56909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM学习总结:字节码篇

本文是学习尚硅谷宋红康老师主讲的 尚硅谷JVM精讲与GC调优教程 的总结 &#xff0c;部分内容也参考了 JavaGuide 网站&#xff08;文末有链接&#xff09; JVM 概述 Oracle JDK 与 OpenJDK 是什么关系&#xff1f; 2006 年 SUN 公司将 Java 开源&#xff0c;也就有了 OpenJDK。…

Games202作业5(完结)

单帧降噪 也就是针对图像空间进行降噪 也就是我们需要在像素&#xff08;i,j&#xff09;的四周进行采样&#xff0c;然后将采样的权重加到一起&#xff0c;然后所有的权重和像素的乘积也加到一起&#xff0c;然后相除&#xff0c;得到最终滤波后的(i,j)像素期望的结果。 Buf…

P4可编程技术详解:从理论到硬件实现

P4的诞生 为打破传统的固定封装模式&#xff0c;充分解放数据平面的编程能力&#xff0c;Nick McKeown领导的斯坦福大学研究团队于2014年提出可编程处理语言P4。借助P4的数据平面编程能力&#xff0c;用户可在网卡、交换机、路由器等网络设备上实现包括VXLAN、MPLS等在内的各种…

电影评论网站开发:Spring Boot技术指南

3系统分析 3.1可行性分析 通过对本电影评论网站实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本电影评论网站采用SSM框架&#xff0c;JAVA作为开发语言&#…

Linux文件的查找和打包以及压缩

文件的查找 文件查找的用处&#xff0c;在我们需要文件但却又不知道文件在哪里的时候 文件查找存在着三种类型的查找 1、which或whereis&#xff1a;查找命令的程序文件位置 2、locate&#xff1a;也是一种文件查找&#xff0c;但是基于数据库的查找 3、find&#xff1a;针…

基于SpringBoot+Vue+uniapp微信小程序的社区门诊管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念&#xff0c;提供了一套默认的配置&#xff0c;让开发者可以更专注于业务逻辑而不是配置文件。Spring Boot 通过自动化配置和约…

01 设计模式-创造型模式-工厂模式

工厂模式&#xff08;Factory Pattern&#xff09;是 Java 中最常用的设计模式之一&#xff0c;它提供了一种创建对象的方式&#xff0c;使得创建对象的过程与使用对象的过程分离。 工厂模式提供了一种创建对象的方式&#xff0c;而无需指定要创建的具体类。 通过使用工厂模式…

1.2.3 TCP IP模型

TCP/IP模型&#xff08;接网叔用&#xff09; 网络接口层 网络层 传输层 应用层 理念&#xff1a;如果某些应用需要“数据格式转换”“会话管理功能”&#xff0c;就交给应用层的特定协议去实现 tip&#xff1a;数据 局部正确不等于全局正确 但是&#xff0c;数据的 全局正…

数码准备记录

1.数据结构 常见的数据结构包括数组、链表、栈、队列、树&#xff08;如二叉树、B树、B树&#xff09;、图等 2.队列和栈的区别 队列是一种先入先出的数据结构&#xff0c;即最先加入的元素被最先移除&#xff1b; 栈是一种后进后出的数据结构&#xff0c;即最后加入的元素…

RTMP协议分析

理论 总体介绍 RTMP协议是应⽤层协议&#xff0c;是要靠底层可靠的传输层协议&#xff08;通常是TCP&#xff09;来保证信息传输的可靠性的。在基于传输层协议的链接建⽴完成后&#xff0c;RTMP协议也要客户端和服务器通过“握⼿”来建⽴基于传输层链接之上的RTMP Connection链…

Collection 单列集合 List Set

集合概念 集合是一种特殊类 ,这些类可以存储任意类对象,并且长度可变, 这些集合类都位于java.util中,使用的话必须导包 按照存储结构可以分为两大类 单列集合 Collection 双列集合 Map 两种 区别如下 Collection 单列集合类的根接口,用于存储一系列符合某种规则的元素,它有两…

Electron-(二)桌面应用的启动动画创建

一、概述 在很多桌面应用中都会有启动画面的显示。启动画面可以解决在启动时耗时较长&#xff0c;将每一步反馈给用户。另外一方面解决启动过程中的环境检查及检查结果的反馈。 在当今的桌面应用领域&#xff0c;启动动画已成为提升用户体验的重要组成部分。它不仅仅是一个简单…

【Linux】main函数的参数列表从何而来?

Linux系统进程通过exec系列函数启动新程序时&#xff0c;argc整型 、 argv数组 和 环境变量表 environ 会作为 exec 系列函数的参数&#xff0c;显式传递给新程序的 main 函数。 main函数的参数列表 在C语言中&#xff0c;main函数的标准参数列表通常如下所示&#xff1a; in…

极客wordpress模板

这是一个展示WordPress主题的网页设计。页面顶部有一个导航栏&#xff0c;包含多个选项&#xff0c;如“关于我们”、“产品中心”、“案例展示”、“新闻动态”、“联系我们”和“技术支持”。页面中间部分展示了多个产品&#xff0c;每个产品都有一个图片和简短的描述。页面下…

MySQL【知识改变命运】06

前言&#xff1a;在05这节数据结构里面&#xff0c;我们知道select * from 这个操作很危险&#xff0c;如果数据库很大&#xff0c;会把服务器资源耗尽&#xff0c;接下来提到的查询可以有效的限制返回记录 1&#xff1a;分页查询 分页查询可以有效控制一次查询出来的结果集的…

【CTF刷题9】2024.10.19

[MoeCTF 2021]babyRCE 考点&#xff1a;关键词过滤&#xff08;绕过方法参考往期博客&#xff09; 来源&#xff1a;nssctf <?php$rce $_GET[rce]; if (isset($rce)) {if (!preg_match("/cat|more|less|head|tac|tail|nl|od|vi|vim|sort|flag| |\;|[0-9]|\*|\|\%|\&g…

图像中的数值计算

目录 图像读取与形状图像数据展示图像数据操作超出范围的像素值处理 图像读取与形状 使用cv2.imread函数读取图像文件。图像的形状通过shape属性获取&#xff0c;格式为(高度, 宽度, 颜色通道数)。 import cv2img1 cv2.imread(bg.jpg) img2 cv2.imread(fish.jpg)print(img1…

Linux服务器安装SRAToolkit教程

SRAToolkit是由NCBI&#xff08;美国国家生物技术信息中心&#xff09;提供的一个工具集&#xff0c;用于下载、读取和转换SRA&#xff08;Sequence Read Archive&#xff09;格式的数据文件。这些数据文件包含了大规模的核酸序列数据&#xff0c;对于基因组学研究至关重要。本…

pytorch激活函数介绍

在 PyTorch 中,激活函数(Activation Functions)是神经网络中重要的非线性组件,用于引入非线性,使网络能够学习复杂的函数关系。以下是 PyTorch 中常见的激活函数及其特点: 1. ReLU (Rectified Linear Unit) 函数: torch.nn.ReLU()公式: ReLU(x)=max⁡(0,x)特点: 常用于隐…

python-代码技巧

python-代码技巧 简单tips1、多个列表循环遍历2、使用map对列表中多个文件进行批量操作 仅个人笔记使用&#xff0c;感谢点赞关注 简单tips 1、多个列表循环遍历 dataTypes ["train","test"] dataStations ["1","2","3"…