Luogu P7870
P7870 兔已着陆 题解
出题人老东方了
蒟蒻第一次使用
前置芝士:栈(百度百科)
题意翻译:
有一初始为空的栈
1 l r
在栈顶依次加入元素
2 k
将栈顶
注意: ,不开 long long
见祖宗
暴力思路(50分,开满会炸空间和时间):
手写一个基本的栈:
typedef long long ll;
struct STACK{
ll stk[N],*_top=stk;//_top为栈顶指针
void push(ll x){
_top++;
*_top=x;
}
void pop(){
_top--;
}
ll top(){
return *_top;
}
bool empty(){
return _top==stk;
}
}stk;
empty()函数似乎没啥用
每次进行1操作,将从 push
每次2操作,令 ans=0
,每次 ans+=stk.top(),stk.pop();
执行
思路简单,不多说了,最终结果:
优化(100分):
分析入栈元素特点,可以发现它们都是公差为
因此,可以用一个结构体代替一个等差数列:
typedef long long ll;
struct Stk{
ll l,r;
ll len(){//数列长度
return r-l+1;
}
}_stk[N];
则当要全部取出这个数列时,其贡献的价值:
ll getall(){
return len()*(r+l)/2;//等差数列求和公式,O(1)得出贡献值
}
(Stk结构体成员函数)
但有时只会取出此数列的后
同时取出后的原数列的后
ll get(ll n){
ll res=n*(r+r-n+1)/2;//求和公式
r-=n;
return res;
}
(Stk结构体成员函数)
我们的栈结构体便可以如下:
struct STACK{
struct Stk{
ll l,r;
ll len(){ return r-l+1; }
ll getall(){ return len()*(r+l)/2;}
ll get(ll n){
ll res=n*(r+r-n+1)/2;
r-=n;
return res;
}
}_stk[N];
Stk *_top=_stk;
void push(ll l,ll r){
_top++;
*_top=(Stk){l,r};
}
bool empty(){ return _top==_stk; }
}stk;
empty()依旧没什么用
最后,每次访问栈顶的
当
然后,取出此时栈顶数列的后
ll get(ll k){
ll res=0;
while(k>=_top->len()){
res+=_top->getall();
k-=_top->len();
_top--;
}
res+=_top->get(k);
return res;
}
(STACK结构体成员函数)
完事了qwq
最终代码:
#include<bits/stdc++.h>
#define N 500005
typedef long long ll;
using namespace std;
struct STACK{
struct Stk{
ll l,r;
ll len(){ return r-l+1; }
ll getall(){ return len()*(r+l)/2;}
ll get(ll n){
ll res=n*(r+r-n+1)/2;
r-=n;
return res;
}
}_stk[N];
Stk *_top=_stk;
void push(ll l,ll r){
_top++;
*_top=(Stk){l,r};
}
ll get(ll k){
ll res=0;
while(k>=_top->len()){
res+=_top->getall();
k-=_top->len();
_top--;
}
res+=_top->get(k);
return res;
}
bool empty(){ return _top==_stk; }
}stk;
int main(){
ll n;
cin>>n;
while(n--){
int op;
scanf("%d",&op);
if(op==1){
ll l,r;
scanf("%d%d",&l,&r);
stk.push(l,r);
}
else{
ll k;
scanf("%d",&k);
printf("%lld\n",stk.get(k));
}
}
return 0;
}
此代码不能直接复制
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类