<thead id="rp7vf"></thead>
        <address id="rp7vf"></address>
          <address id="rp7vf"></address>

                  <sub id="rp7vf"></sub>

                    HDU6592 Beauty Of Unimodal Sequence

                    Beauty Of Unimodal Sequence

                    给一个序列,在满足单调递增或者单调递减或者先增后减的最长子序列集合里找到下标字典序最大以及最小的两个子序列,输出这两个子序列里元素的下标。

                    n≤3×105

                    moomhxy的题解

                    先正着求一遍LIS,再反着求一遍LIS,求出每个点作为上升子序列结尾的最大长度和每个点作为下降子序列开头的最大长度。

                    我们可以枚举这个单峰序列的峰顶是什么,这样最长长度就找到了。

                    然后考虑怎么构造解。

                    求字典序最小的话,首先找到第一个顶峰,然后往前找递减的序列中下标较小的,往后就依次找,这样能保证字典序最小。

                    如何找这个下标较小的呢?显然我们希望每种结尾长度的点都越靠前越好。所以用单调栈维护即可。

                    最大的话找到最后一个顶峰,往前是依次找,往后是找LIS中下标大的。维护方法类似。

                    时间复杂度 O(n log n),瓶颈在于求LIS。

                    CO int N=300000+10;
                    int a[N],dp[N],up[N],down[N];
                    int h[N],st[N],ans[N];
                    
                    void real_main(int n){
                        fill(dp,dp+n+1,INT_MAX),dp[0]=0;
                        for(int i=1;i<=n;++i){
                            read(a[i]);
                            up[i]=lower_bound(dp+1,dp+n+1,a[i])-dp;
                            dp[up[i]]=a[i];
                        }
                        fill(dp,dp+n+1,INT_MAX),dp[0]=0;
                        for(int i=n;i;--i){
                            down[i]=lower_bound(dp+1,dp+n+1,a[i])-dp;
                            dp[down[i]]=a[i];
                        }
                        // minimum lexicographic order
                        int tot=0;
                        int peak=1,height=up[1]+down[1];
                        for(int i=2;i<=n;++i)
                            if(up[i]+down[i]>height) peak=i,height=up[i]+down[i];
                        int top=0;
                        h[up[peak]]=a[peak];
                        for(int i=peak-1;i;--i){
                            if(a[i]>=h[up[i]+1]) continue;
                            while(top and up[i]>=up[st[top]]) --top;
                            st[++top]=i;
                            h[up[i]]=a[i];
                        }
                        for(;top;--top) ans[++tot]=st[top];
                        ans[++tot]=peak;
                        for(int i=peak+1;i<=n;++i)
                            if(down[i]==down[ans[tot]]-1 and a[i]<a[ans[tot]]) ans[++tot]=i;
                        for(int i=1;i<=tot;++i) printf("%d%c",ans[i]," \n"[i==tot]);
                        // maximum lexcographic order
                        tot=0;
                        peak=1,height=up[1]+down[1];
                        for(int i=2;i<=n;++i)
                            if(up[i]+down[i]>=height) peak=i,height=up[i]+down[i];
                        top=0;
                        st[++top]=peak;
                        for(int i=peak-1;i;--i)
                            if(up[i]==up[st[top]]-1 and a[i]<a[st[top]]) st[++top]=i;
                        for(;top;--top) ans[++tot]=st[top];
                        h[down[peak]]=a[peak];
                        for(int i=peak+1;i<=n;++i){
                            if(a[i]>=h[down[i]+1]) continue;
                            while(tot and down[i]>=down[ans[tot]]) --tot;
                            ans[++tot]=i;
                            h[down[i]]=a[i];
                        }
                        for(int i=1;i<=tot;++i) printf("%d%c",ans[i]," \n"[i==tot]);
                    }
                    int main(){
                        for(int n;~scanf("%d",&n);) real_main(n);
                        return 0;
                    }

                    HDU什么时候开始支持<bits/stdc++.h>了……

                    相关文章
                    相关标签/搜索
                    天下彩票蓝月亮免费精选料 都江堰市| 十堰市| 原平市| 邹平县| 孝昌县| 鄄城县| 临朐县| 张家川| 卢湾区| 天峻县| 韶山市| 双江| 五河县| 礼泉县| 突泉县| 大石桥市| 临汾市| 萍乡市| 石台县| 余江县| 西青区| 大化| 崇左市| 东宁县| 贵南县| 萍乡市| 曲水县| 扎鲁特旗| 乌拉特前旗| 炉霍县| 邯郸市| 运城市| 秀山| 田东县| 临武县| 金门县| 九龙城区| 册亨县| 汝城县| 阿尔山市| 利川市| 古田县| 新和县| 张家港市| 文登市| 长沙县| 凤凰县| 湖北省| 鄂州市| 漳浦县| 永嘉县| 彝良县| 义马市| 临汾市| 西和县| 德安县| 南溪县| 丰宁| 黑山县| 清丰县| 孝昌县| 枣阳市| 惠水县| 横山县| 中宁县| 博湖县| 屏山县| 会昌县| 阿城市| 治多县| 玉山县| 营山县| 抚顺市| 揭东县| 贵德县| 沅陵县| 曲水县| 尼玛县| 中方县| 辉南县| 哈密市| 夹江县| 临武县| 旅游| 永春县| 桑日县| 天长市| 鄂温| 榆树市| 蒙山县| 溧阳市| 仁寿县| 镇康县| 石林| 阳春市| 尉氏县| 栾城县| 中山市| 鞍山市| 商南县| 新昌县| 武隆县| 航空| 宕昌县| 苏州市| 桂平市| 莒南县| 长垣县| 太和县| 巫山县| 桃源县| 长兴县| 磴口县| 吐鲁番市| 湘阴县| 唐海县| 石门县| 永年县| 花垣县| 湟中县| 伊通| 富锦市| 博兴县| 南雄市| 嘉禾县| 庆元县| 嘉兴市| 泗阳县| 岳普湖县| 吉首市| 乌什县| 惠来县| 杭锦旗| 怀化市| 治多县| 浮梁县| 阳谷县| 临桂县| 延安市| 芒康县| 贵定县| 龙山县| 万载县| 鄂尔多斯市| 临泉县| 太保市| 吉水县| 洛扎县| 南汇区| 水富县| 昌图县| 政和县| 周至县| 内黄县| 黎平县| 茂名市| 修水县| 牙克石市| 桦南县| 屏东县| 中江县| 海伦市| 宕昌县| 焦作市| 石河子市| 阳新县| 乌鲁木齐市| 龙口市| 桃江县| 错那县| 嘉黎县| 南充市| 祁阳县| 巩义市| 象山县| 昌江| 古丈县| 奈曼旗| 泸溪县| 抚宁县| 沅陵县| 门头沟区| 磐安县| 阳山县| 个旧市| 盐池县| 屏东县| 额敏县| 玉屏| 泽库县| 璧山县| 牡丹江市| 平安县| 鹤山市| 大城县| 延津县| 凤庆县| 邢台市| 如皋市| 商河县| 鹿邑县| 郓城县| 洞头县| 河津市| 临夏县| 萨迦县| 拉孜县| 益阳市| 凤阳县| 鄂温| 孟州市| 阿尔山市| 枣阳市| 托里县| 古田县| 钟山县| 邛崃市| 扶绥县| 射洪县| 罗定市| 南丹县| 漳平市| 海晏县| 武穴市| 扎赉特旗| 兰州市| 舟曲县| 罗源县| 横山县| 五莲县| 金塔县| 和林格尔县| 资中县| 黄平县| 留坝县| 永仁县| 涪陵区| 嘉鱼县| 新沂市| 彭水| 株洲县| 任丘市| 千阳县| 南通市| 工布江达县| 山东省| 海丰县| 黄平县| 乌兰察布市| 余江县| 团风县| 沈丘县| 嵊州市| 临江市| 颍上县| 图木舒克市| 玛纳斯县| 浦北县| 阜新市| 平果县| 曲周县| 新郑市| 连平县| 色达县| 楚雄市| 南溪县| 西林县| 泾川县| 甘孜县| 临泉县| 故城县| 龙里县| 阳春市| 临朐县| 河北省| 郎溪县| 巴东县| 海丰县| 曲松县| 辽宁省| 灵璧县| 利川市| 会理县| 汶川县| 武宣县| 双城市| 怀柔区| 延安市| 德兴市| 公主岭市| 镇巴县| 康保县| 荆门市| 勐海县| 福海县| 高邑县| 高邮市| 新乡市| 太仓市| 普陀区| 柳林县| 同仁县| 息烽县| 黎川县| 根河市| 皮山县| 郧西县| 平湖市| 新龙县| 务川| 搜索| 全州县| 革吉县| 策勒县| 保定市| 收藏| 墨竹工卡县| 收藏| 鄯善县| 都匀市| 长兴县| 荔波县| 通河县| 马关县| 建昌县| 富顺县| 周至县| 万荣县| http://3g.yqo6j7rl9v.fun http://3g.bo2020enters.fun http://3g.gz1980circuitc.fun http://3g.gz1980doc.fun http://3g.yqo8j8rl6v.fun http://3g.jvz0j6r8o.fun http://3g.gz1980startc.fun http://3g.yqo9j6rl3v.fun http://3g.bo2020reverses.fun http://3g.gz1980treec.fun http://3g.yqo8j7rl2v.fun http://3g.bo2020stops.fun http://3g.gz1980wearc.fun http://3g.yqo7j0rl2v.fun http://3g.bo2020creazs.fun http://3g.gz1980evenc.fun http://3g.yqo2j1rl2v.fun http://3g.gz1980sharec.fun