- 1、本文档共10页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
单调栈单调队列By苏赞文
看一个简单问题求一串数的最长不降子序列的个数。如:13627589ans:6维护一个单调不减栈~
例题:LargestRectangleinaHistogram〔POJ2559〕给定一串长度为n(n=100000)的序列hi(hi=10^9),可以画出其直方图,问其中面积最大的矩形是多大?如n=7,序列为2145133
思想朴素的做法,复杂度最坏为O〔n^2〕对于一个数a[i]来说,如何找到向左和向右能扩展到的位置?两种实现方法,模拟下~
核心代码一:栈扫描〔单调栈〕,复杂度接近O〔n〕longlongans=0;inttop=0;list[n]=0;stack[top]=list[0];idx[top++]=0;for(inti=1;i=n;i++){if(stack[top-1]list[i]){while(top0stack[top-1]list[i]){longlongtmp=(longlong)(i-idx[top-1])*stack[top-1];if(tmpans){ans=tmp;}top--;}stack[top++]=list[i];}else{stack[top]=list[i];idx[top++]=i;}}printf(%lld\n,ans);
核心代码二:将高度从高到低排序,用并查集维护当前集合的宽度〔节点个数〕,取max(当前高度*宽度)为答案。复杂度为O(nlogn+na(n))h[n+1]=h[0]=-1;for(i=1;i=n;i++)l[i]=r[i]=i;for(i=1;i=n;i++) while(h[l[i]-1]=h[i])l[i]=l[l[i]-1];for(i=n;i=1;i--) while(h[r[i]+1]=h[i])r[i]=r[r[i]+1];
作业:POJ2559349427962082〔差不多一样的〕POJ2452〔思想难〕
例题:SecondMyProblemFirst〔hdu3706〕Giveyouthreeintegersn(1=n=107),AandB(1=A,B=231-1)DefineSi=AimodBandTi=Min{Sk|i-A=k=Ik=1}.CalculatetheproductofTi(1=i=n)modB.
核心代码:longlongtmp=1,res=1;inthead=0,rear=-1;for(inti=1;i=n;i++){tmp*=a;tmp%=b;while(rear=headQ[rear]=tmp){rear--;}Q[++rear]=tmp;idx[rear]=i;while(idx[head]i-a){head++;}res=(res*Q[head])%b;}printf(%lld\n,res);POJ2823
Thanks~
文档评论(0)