[bzoj1345][Baltic2007]序列问题_单调栈
bzoj-1345 Baltic-2007 序列问题
题目大意:对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列。这一操作的代价是max(ai,ai+1)。进行n-1次该操作后,可以得到一个长度为1的序列。我们的任务是计算代价最小的reduce操作步骤,将给定的序列变成长度为1的序列。
数据范围:$1\le n\le 10^6$,$0\le a_i\le 10^9$。
想法:
这个题的考虑方法比较经典
就是对于每一个操作,把它按照某种规则分类。
然后分类之后比较好统计什么的。
像$CF1151E$一样的类型。
好,单独看这个题。
我们把每次合并当做一个小数被吃了。
所以我们就统计没个数被吃了那次的答案和即可。
假设$pre[i]$和$nxt[i]$分别表示第$i$个数前面比它大的第一个和后面比它大的第一个。
这个数一定是被前面的某个或者后面的某个吃掉。
如果这两个在当前数被吃掉之前被吃掉了,那一定没有当前数先被吃掉优。
故此我们用单调栈求出每个数前面第一个比它大的,和后面第一个比它大的。
每个数的答案就是$min(a_{pre_i},a_{nxt_i})$。
注意最大值没有贡献。
代码:
#include <bits/stdc++.h>
#define inf (1 << 30)
#define N 1000010
using namespace std;
int a[N],q[N],pre[N],nxt[N];
typedef long long ll;
ll ans=0;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rd() {int x=0,f=1; char c=nc(); while(c<48) {if(c=='-') f=-1; c=nc();} while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x*f;}
int main()
{
int n=rd();
for(int i=1;i<=n;i++) a[i]=rd();
int top=0;
for(int i=1;i<=n;i++)
{
while(top && a[i] > a[q[top]]) top -- ;
pre[i] = q[top];
q[++top]=i;
}
top=0;
for(int i=n;i;i--)
{
// printf("top : %d\n",top);
while(top && a[i] > a[q[top]]) top -- ;
nxt[i] = q[top];
q[++top]=i;
}
// for(int i=1;i<=n;i++) cout << pre[i] << ' ' << nxt[i] << endl ;
a[0]=inf;
for(int i=1;i<=n;i++) if(pre[i] || nxt[i]) ans += min(a[pre[i]],a[nxt[i]]);
cout << ans << endl ;
return 0;
}
小结:这种解题方法比较独特,类型题好像也挺多的。看能不能想到吧。
[bzoj1345][Baltic2007]序列问题_单调栈的更多相关文章
- BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈
BZOJ_1345_[Baltic2007]序列问题Sequence_单调栈 Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai ...
- 【bzoj1345】[Baltic2007]序列问题Sequence 单调栈
题目描述 对于一个给定的序列a1, …, an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用一个元素max(ai,ai+1)替代,这样得到一个比原来序列短的新序列.这一 ...
- BZOJ1345 Baltic2007 序列问题Sequence 【思维题】*
BZOJ1345 Baltic2007 序列问题Sequence Description 对于一个给定的序列a1,…,an,我们对它进行一个操作reduce(i),该操作将数列中的元素ai和ai+1用 ...
- BZOJ_1307_玩具_单调栈+双指针
BZOJ_1307_玩具_单调栈+双指针 Description 小球球是个可爱的孩子,他喜欢玩具,另外小球球有个大大的柜子,里面放满了玩具,由于柜子太高了,每天小球球都会让妈妈从柜子上拿一些玩具放在 ...
- BZOJ1345: [Baltic2007]序列问题Sequence
1345: [Baltic2007]序列问题Sequence Time Limit: 5 Sec Memory Limit: 162 MBSubmit: 556 Solved: 274[Submi ...
- 【HNOI2016】序列 莫队+单调栈+RMQ
Description 给定长度为n的序列:a1,a2,…,an,记为a[1:n].类似地,a[l:r](1≤l≤r≤N)是指序列:al,al+1,…,ar-1,ar.若1≤l≤s≤t≤r≤n,则称a ...
- [bzoj4826][Hnoi2017]影魔_单调栈_主席树
影魔 bzoj-4826 Hnoi-2017 题目大意:给定一个$n$个数的序列$a$,求满足一下情况的点对个数: 注释:$1\le n,m\le 2\cdot 10^5$,$1\le p1,p2\l ...
- 2018.11.02 NOIP模拟 优美的序列(数论+单调栈/链表)
传送门 考虑如果一个区间满足最小值等于最大公约数那么这个区间是合法的. 因此我们对于每一个点维护可以延展到的最左/右端点保证这一段区间的gcdgcdgcd等于这个点的值. 这个可以用之前同类的链表或者 ...
- BZOJ 1345[BOI]序列问题 - 贪心 + 单调栈
题解 真的没有想到是单调栈啊. 回想起被单调栈支配的恐惧 最优情况一定是小的数去合并 尽量多的数,所以可以维护一个递减的单调栈. 如果加入的数比栈首小, 就直接推入栈. 如果加入的数大于等于栈首, 必 ...
随机推荐
- 2019的hdu暑假作业(欢迎纠错)
1219 遍历计数. #include<bits/stdc++.h> #define QAQ 0 using namespace std; ]; ]; int main(){ )){ me ...
- css3中animation属性animation-timing-function知识点以及其属性值steps()
在animation中最重要的其实就是时间函数(animation-timing-function)这个属性,他决定了你的动画将以什么样的速度执行,所以最关键的属性值也就是cubic-bezier(n ...
- PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15)
PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15) http://www.patest.cn/contests/pat-b-practise/10 ...
- iterator方法和for方法 遍历数据库user表结果集ResultSet
首先,把连接数据库的语句做成工具类,因为会一直用到这几句 代码如下: package com.swift.jdbc; import java.sql.Connection; import java.s ...
- POJ-3669-流星雨
这题的话,卡了有两个小时左右,首先更新地图的时候越界了,我们进行更新的时候,要判断一下是不是小于零了,越界就会Runtime Error. 然后bfs 的时候,我没有允许它搜出300以外的范围,然后就 ...
- Python Third Day-文件处理
文件处理 打开文件,得到文件句柄并赋值给一个变量f=open('a.txt','r',encoding='utf-8')#默认打开的方式为r指的是文本文件,全名为‘rt’#w文件方式指的是如果有a.t ...
- linux下mysql常用的基本命令
linux数据库环境搭建好之后,我们就可以创建数据库了. 一 查看版本 mysql --version 二 进入数据库 首先在根目录执行命令 mysql -u root -p 然后输入密码 进 ...
- python--线程的其他方法
一 . current_thread的用法 import threading import time from threading import Thread, current_thread def ...
- shell-code-5-函数
# 函数必须在使用前定义 # 如果不写return,将以最后一条命令运行结果,作为返回值. return后跟数值n(0-255) myFistFunc(){ read a read b return ...
- sqoop导数据出现问题
执行下面命令的时候报错 ./sqoop import \ --connect jdbc:mysql://mini1:3306/userdb \ --username root \ --password ...