题解 P1486 【[NOI2004]郁闷的出纳员】
Vector大法好~
核心代码只有短短的10多行,你值得拥有
multiset捞爆了,只有40分
Vector提交记录
-
vector通过lower_bound和insert操作能够维护一个有序递减/递增的线性表
-
insert复杂度虽然是O(n),实际表现却非常快(可以看做sqrt(n)),配合lower_bound能够做到许多事情
-
在这道题中,我们重载了lower_bound的<运算符,维护一个单调递减的序列
有两处需要注意的细节
-
erase的复杂度为O(n),因为是区间删除,我们要避免用erase操作,注意到删除的区间是序列中最小的一段区间,考虑用O(1)的pop_back
-
pop_back的复杂度是O(1),元素总数不超过100000,故删除操作总复杂度为O(N)
-
查询元素总数时,我们也不用STL的size()(单次复杂度O(N)),而是手动维护一个siz变量
const int inf=0x3f3f3f3f,N=1e5+10;
int n,dn,delta=0,siz=0;
vector<int>s;
typedef vector<int>::iterator It;
bool cmp(const int &a,const int &b){return a>b;}
int main(){
//fin;fout;
read(n),read(dn);
char op;int x;
int ans=0;
go(i,1,n){
cin>>op;
read(x);
switch(op){
case 'I':if(x>=dn) s.insert(lower_bound(s.begin(),s.end(),x-delta,cmp),x-delta),siz++;break;
case 'A':delta+=x;break;
case 'S':{
delta-=x;
int it=upper_bound(s.begin(),s.end(),dn-delta,cmp)-s.begin();
while(siz!=it) s.pop_back(),ans++,siz--;
break;
}
case 'F':{
if(siz<x) puts("-1");
else{
printf("%d\n",s[x-1]+delta);
}
break;
}
}
}
printf("%d",ans);
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库