AtCoder Grand Contest 005【A栈模拟,B单调栈】
2024-10-19 15:40:00
挖草,AtCoder实在是太吊了~
%%%,目前只A了两题;
A题:
就是利用栈模拟一下就好了;S进栈,T的话有S就出栈,然后len减一下就好了;
#include <bits/stdc++.h>
using namespace std;
char s[200020];
stack<int>q;
int main()
{
scanf("%s",s+1);
int len=strlen(s+1);
int ans=0;
for(int i=1;i<=len;i++)
{
if(s[i]=='S')
{
q.push(1);
}
else
{
if(!q.empty())
{
ans+=2;
q.pop();
}
}
}
printf("%d\n",len-ans);
return 0;
}
B题【单调栈】
题意:
简单粗暴:
就是求所有区间的最小值之和
思路:
对于a[i]找他的对于区间的贡献,利用单调栈可以降低复杂度求得前面多少个比他大num1,后面多少个比他大num2,然后贡献就是区间长度*a[i];
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e5+10;
struct asd{
LL pre;
LL num;
LL next;
LL k;
};
stack<asd>q;
LL t[N];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lld",&t[i]);
LL ans=0;
asd tmp;
tmp.num=t[1];
tmp.pre=tmp.next=1;
tmp.k=1;
q.push(tmp);
LL x=0,y=0;
for(LL i=2;i<=n;i++)
{
asd tmp1;
tmp1.num=t[i];
tmp1.pre=tmp1.next=1;
tmp1.k=i;
while(!q.empty()&&tmp1.num<=q.top().num)//如果说这个元素是小于栈顶的,那么它里面的栈就要被更新,这个元素的pre也要被更新
{
tmp=q.top();
q.pop();
if(!q.empty())
q.top().next+=tmp.next;
tmp1.pre+=tmp.pre;
ans+=tmp.pre*tmp.next*tmp.num;
}
q.push(tmp1);
}
while(!q.empty())
{
tmp=q.top();
q.pop();
if(!q.empty())
q.top().next+=tmp.next;
ans+=tmp.num*tmp.next*tmp.pre;
}
printf("%lld\n",ans);
}
最新文章
- 折腾一两天,终于学会使用grunt压缩合并混淆JS脚本,小激动,特意记录一下+spm一点意外收获
- 了解HTML表单之input元素的23种type类型
- 《Inside UE4》-0-开篇
- OpenSSL命令---passwd
- 用canvas实现图片滤镜效果详解之视频效果
- ISO-8859-1
- linux内核启动参数
- OpenWrt opkg 在线源默认配置
- PHP_零基础学php_3PHP函数、传参函数、默认参数、函数返回值
- n人围成一圈报数
- Linux服务器,服务管理--systemctl命令详解,设置开机自启动
- mysql常用操作小节
- wriesharek同时监听多个端口
- MAC下搭建个人博客
- Docker 入门 第三部分: 服务
- 一场关于 .net core 和 .net framework 编码的案情分析
- 《杜增强讲Unity之Tanks坦克大战》10-相机控制
- 数据结构与算法之排序(4)希尔排序 ——in dart
- C语言——stdio.h
- PHP简单模拟登录功能实例分享