[题解]P1083 [NOIP2012 提高组] 借教室

news/2024/7/7 15:44:50/文章来源:https://www.cnblogs.com/Sinktank/p/18283918

[题解]P1083 [NOIP2012 提高组] 借教室

解法\(1\):线段树 - \(O((n+m)\log n)\)

比较直观的一种做法,但是可能需要卡一下输入(这里没卡也过了,但要注意输入是\(10^6\)级的,为了保险一定要加)。

#include<bits/stdc++.h>
#define lc (x<<1)
#define rc ((x<<1)|1)
#define int long long
using namespace std;
int n,m,a[1000010],minn[4000010],tag[4000010];
void update(int x){minn[x]=min(minn[lc],minn[rc]);
}
void ch(int x,int v){tag[x]+=v;minn[x]+=v;
}
void pushdown(int x){if(tag[x]){ch(lc,tag[x]);ch(rc,tag[x]);tag[x]=0;}
}
void build(int l,int r,int x){if(l==r){minn[x]=a[l];return;}int mid=(l+r)>>1; build(l,mid,lc);build(mid+1,r,rc);update(x);
}
void modify(int a,int b,int v,int l,int r,int x){pushdown(x);if(a<=l&&r<=b){ch(x,v);return;}int mid=(l+r)>>1;if(a<=mid) modify(a,b,v,l,mid,lc);if(b>mid) modify(a,b,v,mid+1,r,rc);update(x);
}
int query(int a,int b,int l,int r,int x){pushdown(x);if(a<=l&&r<=b) return minn[x];int mid=(l+r)>>1,ans=LLONG_MAX;if(a<=mid) ans=min(ans,query(a,b,l,mid,lc));if(b>mid) ans=min(ans,query(a,b,mid+1,r,rc));return ans;
}
signed main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];}build(1,n,1);for(int i=1;i<=m;i++){int v,l,r;cin>>v>>l>>r;modify(l,r,-v,1,n,1);if(query(1,n,1,n,1)<0){cout<<"-1\n"<<i<<"\n";return 0;}}cout<<"0\n";return 0;
}

解法\(2\):二分答案 - \(O((n+m)\log m)\)

二分枚举申请的编号,对于枚举出的编号。通过差分,计算出处理完当前编号后,每一天剩余的教室数量。如果最终结果存在负数,则r=mid,否则l=mid+1。因为我们要找的是使存在负数的最小编号。

#include<bits/stdc++.h>
#define int long long
#define N 1000010
#define M 1000010 
using namespace std;
int n,m,a[N],b[N],tb[N],c[M],ld[M],rd[M];
bool check(int d){for(int i=1;i<=n;i++) tb[i]=b[i];for(int i=1;i<=d;i++) tb[ld[i]]-=c[i],tb[rd[i]+1]+=c[i];for(int i=1;i<=n;i++) tb[i]+=tb[i-1];for(int i=1;i<=n;i++) if(tb[i]<0) return 1;return 0;
}
signed main(){cin>>n>>m;for(int i=1;i<=n;i++){cin>>a[i];b[i]=a[i]-a[i-1];}for(int i=1;i<=m;i++) cin>>c[i]>>ld[i]>>rd[i];int l=1,r=m;bool flag=0;while(l<r){int mid=(l+r)>>1;if(check(mid)){//不合法 flag=1;r=mid;}else{l=mid+1;}}if(!flag) cout<<"0\n";else cout<<"-1\n"<<l<<"\n";return 0;
}

解法\(3\) - \(O(n+m)\)

总体思路就是用一个指针\(j\),初始为\(m\)。对于每一天,判断完成操作\(1\sim j\)后是否仍然合法。如果不合法了,就把\(j\)往前挪,同时撤回操作,直到该天合法为止。

最后,如果\(j=m\),则说明所有操作都是合法的,输出0

否则,我们需要输出导致不合法的第一个操作。而\(j\)表示的是合法的最后一个操作,输出\(j+1\)即可。

此算法的优势在于,枚举的每一天不需要从最后开始移动指针,而是从上一天的位置开始移动,大大减少了冗余操作。

注意到\(j\)是只减不增的,所以while循环一共最多执行\(m\)次。而for一共执行\(n\)次,所以复杂度是\(O(n+m)\)

#include<bits/stdc++.h>
#define N 1000010
#define M 1000010
#define int long long
using namespace std;
int n,m,a[N],c[M],l[M],r[M];
int cf[N];
signed main(){cin>>n>>m;for(int i=1;i<=n;i++) cin>>a[i];for(int i=1;i<=m;i++){cin>>c[i]>>l[i]>>r[i];cf[l[i]]+=c[i],cf[r[i]+1]-=c[i];}int j=m,sum=0;//sum表示完成操作1~j后,第i天一共用去多少教室for(int i=1;i<=n;i++){sum+=cf[i];//cf[i]表示完成操作j之后,第i天一共用去多少个教室while(sum>a[i]){//用去的>已有的,不合法,需要撤回操作cf[l[j]]-=c[j],cf[r[j]+1]+=c[j];if(l[j]<=i&&i<=r[j]) sum-=c[j];j--;}}if(j==m) cout<<"0\n";else cout<<"-1\n"<<j+1<<"\n";return 0;
}

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

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

相关文章

markdown,学习第一天

markdown学习 标题 三级标题 字体 hello world! hello world! hello world! hello world! hello world! 引用,前面加>狂神牛逼分割线,加“---”,加“***”图片:超链接:英文字符下,这里描述链接 [点击到我自己的博客园](屮艸芔茻13 - 博客园 (cnblogs.com)) 列表,1.加空格…

vue项目中使用AES实现密码加密解密ECB和CBC模式)

ECB: 是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。CBC: 是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSe…

VMware开启CentOS Stream 9操作系统提示 “此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的解决方案

解决步骤: 1.重启电脑 2.华硕主板按(F2或DEL)键进入BIOS 3.进入高级->CPU设置4.下拉,Inter Virtualization Technology 开启5.退出->保存改动 参考网址: https://blog.csdn.net/web22050702/article/details/138712829本文来自博客园,作者:阿慢2010,转载请注明原…

基于centos8使用seafile搭建家用nas

本文详细总结了在CentOS 8下使用Seafile搭建家用NAS的全过程,涵盖了虚拟机的建立、MariaDB和Seafile的安装、防火墙端口配置、数据盘RAID1的创建、Seafile数据目录的迁移、用户管理、开机自启动设置以及静态IP地址的配置等内容,旨在为初学者提供一个完整的指南。目录 前言:1…

在Ubantu22.04中运行ORB_SLAM3并进行源码解析

在Ubantu22.04中运行ORB_SLAM3并进行源码解析 1.ORB_slam3简介 ORB-SLAM3 是一款前沿的即时定位与建图(SLAM)系统,专为大规模环境下的实时定位与三维重建设计。系统兼容多种视觉传感器配置,包括单目、立体双目以及RGB-D相机。ORB-SLAM3 采用 Oriented FAST 和 Rotated BRIE…

Joplin主题样式及markdown渲染样式更改

本文详细介绍了如何在Joplin笔记软件中更改主题样式和Markdown渲染样式,提供了具体的操作步骤和代码示例,帮助用户自定义Joplin的外观,使其更加美观和符合个人喜好。前言 Joplin是一款极佳的笔记软件,拥有开源、免费、可自定义程度高等多种优点,但其默认的软件主题和Markd…

模拟集成电路设计系列博客——9.2 电平转换器

模拟集成电路设计 9.2 电平转换器 电平转换器是集成电路设计中的一个重要部分,常用于芯片多电压域低功耗设计和I/O中。我们知道在集成电路中,I/O电压与Core电压常常处于两个不同的电压域,因此我们需要使用电平转换器(level shifter)来将I/O电压降低到Core电压,或者将Core…

泛语言计划 第二弹 函数

开始之前,我们先复习一下数学中是怎么定义函数的。 数集A和B,如果A所有数在B中都存在且只有一个数与之对应,则称B是A的函数 由此,我们可以看出一个关键词:对应。 编程中的函数也一样,只是编程中不一定是数,也可以是布尔值、字符串,甚至操作。 这个A集,我们叫他参数,B…

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署)

Kubernetes云原生存储解决方案openebs部署实践-4.0.1版本(helm部署) 简介 OpenEBS 是一种开源云原生存储解决方案。OpenEBS 可以将 Kubernetes 工作节点可用的任何存储转化为本地或复制的 Kubernetes 持久卷。OpenEBS 帮助应用和平台团队轻松地部署需要快速、持久耐用、可靠且…

想要流程化办公,不妨了解拖拽式报表设计器!

看看拖拽式报表设计器是如何为客户降低成本、提高效率,携手进入产业分工新时代。当前,经济发展越来越快,经济水平提升的同时也给职场人提成了更高的要求。很多领域的客户都希望能实现降本、提质、增效,进入流程化办公新时代,可以先来了解低代码技术平台、拖拽式报表设计器…

代码随想录算法训练营第四十九天 | 300.最长递增子序列 674.最长连续递增序列 718.最长重复子数组

300.最长递增子序列 题目链接 文章讲解 视频讲解动规五部曲:dp[i]: 表示考虑元素i的最长子序列为dp[i] 递推公式:dp[i] = max(dp[j] + 1, dp[i]); 初始化:dp[i] = 1; 每个元素单独算一个子序列长度为1 遍历顺序:从前向后遍历 打印dp数组class Solution { public:int length…

基于LEACH路由协议的网络性能matlab仿真,包括数据量,能耗,存活节点

1.程序功能描述LEACH的原理在于它将传感器节点分为两类:簇头节点和普通节点。普通节点将数据发送给距离自己最近的簇头节点,然后簇头节点将收集到的数据融合后发送给基站。这种机制可以减少网络中节点的能耗,并且能够提高数据融合比例,减少传输数据量。本课题将分别对比lea…

高二的他已通过NOI保送北大了,让我们一起了解他的信息学奥赛学习经历吧!!!

相信关注本号的各位,对于信息学奥赛已经不陌生了,部分同学也已经开始踏入信息学的旅程,但前路茫茫,让我相信关注本号的各位,对于信息学奥赛已经不陌生了,部分同学也已经开始踏入信息学的旅程,但前路茫茫,让我们一起看看已经取得成就的同学的经历吧。今天要介绍的这位同…

VPS折腾记七搭建稍后阅读应用

1.简介 看微信公众号的时候,文章太长,可以收藏起来,但是等到晚上看的时候,发现作者已经删除了,很遗憾。wallabag能够收藏文章并且保存到服务器,让我们可以稍后阅读,而且也不怕文章丢失。 wallabag is a self hostable application for saving web pages: Save and class…

基于PSO粒子群优化的CNN-LSTM的时间序列回归预测matlab仿真

1.算法运行效果图预览 2.算法运行软件版本 matlab2022a3.部分核心程序for i=1:Iterifor j=1:Npeoprng(i+j)if func_obj(x1(j,:))<pbest1(j)p1(j,:) = x1(j,:);%变量pbest1(j) = func_obj(x1(j,:));endif pbest1(j)<gbest1g1 = p1(j,:);%变量gbest1 = pbest1(j);end…

关于领域驱动设计,大家都理解错了

翻遍整个互联网,我发现,关于领域驱动设计,大家都**理解错了**。 今天,我们尝试通过一篇文章的篇幅,给大家展示一个完全不同的视角,把“领域驱动设计”这六个字解释清楚。 ## 领域驱动设计学习资料现状领域驱动设计的概念提出已经有20年的时间了,整个互联网充斥着大量书籍…

7.4日BootlLoad总结

最近在研究单片机远程升级方法,看了网上许多资料后了解到,远程升级就是用IAP方法去烧写flash区,而IAP方法在EEPROM中有用到,也就是所说的掉电记忆,掉电不丢失的情况,而相较于51单片机,网上的资料大多是有关STM32单片机的,且使用操作系统,适合于芯片内存较大的芯片,分…

(一):小程序与服务器的链接

首原文写于18年5月,因不再想继续使用C站,现将主要文件迁移至博客园。文中涉及技术部分已相对过时,但依旧对初始web的小朋友具有一定参考价值,权且玩乐。 环境IDE:myeclipse,服务器容器Tomcat,服务端主要用servlet。创建servlet小程序与服务器链接(前端和后端的交互)的…

可视化数据看板/数字孪生大屏到底有没有实际价值?详解数据可视化的实用价值

数据驾驶舱/数据看板/可视化大屏的实际价值,取决于使用者的实际需求。华而不实?华就是实! 关于可视化大屏最广泛的争议,便是对其“华而不实”的批评,认为可视化大屏缺乏技术含量,只是一钟比较高级的“装饰品”,更是一种典型的“面子工程”。这种偏见乍一看似乎有其道理,…

osg使用整理(12):SSAO屏幕空间环境光遮蔽

一、基础概念 1、SSAO:通过将褶皱、孔洞和非常靠近墙面变暗的方法,近似模拟间接光照。SSAO称为屏幕空间环境光遮蔽 ,使用屏幕空间场景的深度而不是真实的几何体数据来确定遮蔽量,速度快效果好。2、实现原理:根据物体表面法线方向生成一个半球随机深度采样,主要看物体周围…