2016百度之星初赛Astar Round2B - 区间的价值
来源:互联网 发布:电脑上的编程软件 编辑:程序博客网 时间:2024/04/30 02:05
题意:
定义一个区间的价值为区间的最大数*最小数。现给了n(1≤n≤100000)个数,问1~n长度的最大价值分别是多少。
题解:
用两个线段树以及快排的思想可以在O(nlog(n))的时间解决该题。
首先用线段树找到一个区间[L,R]的最小值位置为a与最大值位置为b,[L,R]中所有包含[a,b]的区间的价值都为A[a]*A[b]。然后对[L,a-1],[a+1,R]重复这个过程。
Code:
#include<iostream>#include<stdio.h>#include<string.h>#include<set>#include<ctime>#include<algorithm>#include<queue>#include<cmath>#include<map>#define ll long longusing namespace std;const int MAXN=100005;ll MAX[MAXN<<2],MIN[MAXN<<2],A[MAXN],ANS[MAXN];void updateMAX(int x,int l,int r,int now){ if (l==r){ MAX[now]=l; return; } int mid=(l+r)>>1; if (x<=mid) updateMAX(x,l,mid,now<<1); else updateMAX(x,mid+1,r,(now<<1)|1); if (A[MAX[now<<1]]>A[MAX[now<<1|1]]) MAX[now]=MAX[now<<1]; else MAX[now]=MAX[now<<1|1];}void updateMIN(int x,int l,int r,int now){ if (l==r){ MIN[now]=l; return; } int mid=(l+r)>>1; if (x<=mid) updateMIN(x,l,mid,now<<1); else updateMIN(x,mid+1,r,(now<<1)|1); if (A[MIN[now<<1]]<A[MIN[now<<1|1]]) MIN[now]=MIN[now<<1]; else MIN[now]=MIN[now<<1|1];}int queryMAX(int l,int r,int L,int R,int now){ if (l>=L && r<=R) return MAX[now]; int mid=(l+r)>>1,a=0,b=0; if (L<=mid) a=queryMAX(l,mid,L,R,now<<1); if (R>mid) b=queryMAX(mid+1,r,L,R,now<<1|1); if (a==0) return b; if (b==0) return a; if (A[a]>A[b]) return a; return b;}int queryMIN(int l,int r,int L,int R,int now){ if (l>=L && r<=R) return MIN[now]; int mid=(l+r)>>1,a=0,b=0; if (L<=mid) a=queryMIN(l,mid,L,R,now<<1); if (R>mid) b=queryMIN(mid+1,r,L,R,now<<1|1); if (a==0) return b; if (b==0) return a; if (A[a]<A[b]) return a; return b;}void dfs(int l,int r,int n){ if (r<l) return; int a=queryMAX(1,n,l,r,1),b=queryMIN(1,n,l,r,1); if (a>b) swap(a,b); ll d=A[a]*A[b]; for (int i=(b-a+1);i<=(r-l+1);i++) ANS[i]=max(ANS[i],d); if (A[b]>A[a]) dfs(a+1,r,n),dfs(l,a-1,n); else dfs(b+1,r,n),dfs(l,b-1,n);}int main(){ int n; // freopen("input.txt","r",stdin); // freopen("output.txt","w",stdout); while (~scanf("%d",&n)){ memset(MAX,0,sizeof(MAX)); memset(MIN,0,sizeof(MIN)); for (int i=1;i<=n;i++){ scanf("%I64d",&A[i]); updateMAX(i,1,n,1); updateMIN(i,1,n,1); } memset(ANS,0,sizeof(ANS)); dfs(1,n,n); for (int i=1;i<=n;i++) printf("%I64d\n",ANS[i]); } return 0;}
0 0
- 2016百度之星初赛Astar Round2B - 区间的价值
- 2016"百度之星" 初赛(Astar Round2B) 1001 区间的价值
- 2016"百度之星“-初赛(Astar Round2B)-A.区间的价值
- HDU5696 2016百度之星初赛Astar Round2B 区间的价值
- 2016"百度之星" - 初赛(Astar Round2B)解题报告
- 百度之星2016初赛(第二场) -- Astar Round2B
- 2016"百度之星" - 初赛(Astar Round2B)
- 2016"百度之星" - 初赛(Astar Round2B)解题报告
- 2016"百度之星" - 初赛(Astar Round2B)题解
- 2016"百度之星" - 初赛(Astar Round2B)1006
- 2016"百度之星" - 初赛(Astar Round2B)瞬间移动
- 2016"百度之星" - 初赛(Astar Round2B)
- 2016"百度之星" - 初赛(Astar Round2B)瞬间移动
- 2016"百度之星" - 初赛(Astar Round2B)解题报告
- HDU5699 2016"百度之星" - 初赛(Astar Round2B)货物运输
- HDU 5698 瞬间移动 (2016"百度之星" - 初赛(Astar Round2B) 1003)
- hdu 5698 瞬间移动(2016"百度之星" - 初赛(Astar Round2B)——数学题)
- HDU 5701 中位数计数( 2016"百度之星" - 初赛(Astar Round2B) 思维 + 暴力)
- UNIX网络编程 1-2章学习笔记
- 命令行kill掉某个进程
- C语言实现的RSA算法程序
- hadoop 分布式环境搭建与hdfs简单实用
- spring源码导入Eclipse火星版出现了问题
- 2016百度之星初赛Astar Round2B - 区间的价值
- Android postTranslate和preTranslate的理解
- 在前台利用jquery对dom元素进行排序
- GitHub for Windows 安装失败,An error occurred attempting to install github 的解决办法
- hadoop hdfs环境搭建
- 2016-5-23
- MCS(调制与编码策略)对应是Qm和TBS index,那么是由什么公司计算出来的?还是由TBS决定的?(MCS为0-31的表)
- webmagic采集CSDN的Java_WebDevelop页面
- CentOS 系统下编译安装 gcc4.8.2过程及编译问题详解