JZOJ.5285【NOI2017模拟8.16】排序

Description

Input

Output

Sample Input

5
2 1 5 3 4

Sample Output

5 4 3 1 2

Data Constraint

Hint

感觉像是某年NOIP的双栈排序的弱化版......

这题要求字典序最大,我们采用贪心做法,我们可以证明这是正确的。

考虑每一位的数字,我们尽可能地让它大,很明显第一位一定能保证是最大值。

那么对于第二位我们当然想让它为第二大的数字,如果这个数字不在栈里面,那么我们可以等待它进栈后再弹出,但如果已经在栈里面,但在栈顶部,我们也可以弹出,但不在栈的顶部,那么无论如何我们都不可能让它弹出来作为第二位了,那么我们期望第三大的数字作为第三位,重复上面的步骤即可。当我们期望的数变成了0,说明已经没有元素还没有进过栈了,我们可以直接把栈里的元素弹出即可。复杂度O(n).

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cmath>
 7 #define N 2000005
 8 using namespace std;
 9 int zhan[N],top,now,qwq,dui[N],n;
10 bool in[N];
11 int main(){
12     memset(in,false,sizeof(in));
13     scanf("%d",&n);
14     for (int i=1;i<=n;i++)
15      scanf("%d",&dui[i]);
16     qwq=0;
17     top=0;
18     now=n;
19     while(qwq!=n){
20         zhan[++top]=dui[++qwq];
21         in[dui[qwq]]=true;
22         if (qwq==n) break;
23         if (zhan[top]==now){
24             printf("%d ",zhan[top]);
25             top--;
26             now--;
27             while (true){
28                 if (zhan[top]>=now){
29                     printf("%d ",zhan[top]);
30                     top--;
31                     if (zhan[top+1]==now) now--;
32                     continue;
33                 }
34                 if (!in[now]) break;
35                 now--;
36             }
37         }
38         if (now==0) break;
39     }
40     for (int i=top;i>0;i--)
41         printf("%d ",zhan[i]);
42     return 0;
43 }

神奇的代码

时间: 2024-11-10 02:14:22

JZOJ.5285【NOI2017模拟8.16】排序的相关文章

Cisco PT模拟实验(16) 路由器重分发配置

Cisco PT模拟实验(16) 路由器重分发配置 实验目的: 掌握路由器重分发的配置方法 掌握査看通过路由重分发学习产生的路由 实验背景: 随着公司网络规模不断扩大,公司内安装了多个路由器并运行多种路由协议,其中,公司出口路由器R2与公司外的一台路由器R3连接,三层交换机与R2间运行RIPv2路由协议,R1与R2间运行静态路由协议,R2与R3间运行OSPF路由协议.现要做适当配置,实现公司内部主机与公司外部主机之间的相互通信. 技术原理: 路由重分发(Route Redistribution)

jquery模拟字母顺序排序定位城市列表方法(bug改进)

jquery模拟字母顺序排序定位城市列表方法 下载地址http://www.lanrenzhijia.com/jquery/3155.html bug 重庆--长沙不能正常排序. 原因是derail有可能会放回两个字符的数组.需要做判断 改进 //改动 特殊字符-->可能还有问题--返回的是数组有两个字符 var   derail =makePy(SortList.eq(i).find('.num_name').text().charAt(0)) if(derail.length==2&&a

JZOJ.5287【NOIP2017模拟8.16】最短路

Description Input Output Sample Input 9 10 2 1 2 1 1 4 1 3 4 1 2 3 1 3 7 1 7 8 2 7 9 2 1 5 3 1 6 4 5 6 1 1 9 5 7  Sample Output 5 6 Data Constraint 容易发现这是一张仙人掌图(每条边最多属于一个环的无向连通图) 仙人掌图求最短路的常用处理方法是将它变成一棵树,原图里为环的点更改为该环上的点都指向该环的某个点A,然后边长就是该点到点A的最短路径. 再预处

JZOJ.5286【NOIP2017模拟8.16】花花的森林

Description Input Output Sample Input 3 1 2 3 1 2 1 3 2 1 Sample Output 6 9 6 Data Constraint Hint 题目大意就是要求删边和计算直径. 很明显每次删边后两边BFS计算直径必会超时,但我们可以通过lca和预处理节点到根节点的距离来快速计算,但删边后lca很可能有所变化,重新预处理lca的信息又太慢了. 我们可以试着逆向. 即正着删边看成反着添边. 这样子我们可以发现是等效的. 一开始每棵树的直径就是该点

jzoj5142 【NOI2017模拟6.12】看无可看

传送门:https://jzoj.net/senior/#main/show/5142 [题目大意] 给出n个数,a[1]...a[n],称作集合S,求 其中f[i] = 2f[i-1] + 3f[i-2],给出f[0],f[1].mod 99991 n<=100000 [题解] 暴力dp,用矩阵作为存储值,复杂度O(n^2) # include <ctype.h> # include <stdio.h> # include <assert.h> # includ

Day1:T1 模拟 T2 拓扑排序

T1:模拟 自己第一天的简直跟白痴一样啊...模拟都会打错.. 当时貌似在更新最大值的时候打逗比了... if((sum[x]==max && x<maxh) || sum[x]>max){  max=sum[x];  maxh=x; //现在(也就是9月+)再看,脑袋里只有sortsortsort,连最基本的更新最大指都忘了....智商唉.... 附上代码: #include<cstdio> #include<cstring> using namesp

jzoj5141 【NOI2017模拟6.12】说无可说

传送门:https://jzoj.net/senior/#main/show/5141 [题目大意] 给出n个字符串,求有多少组字符串之间编辑距离为1~8. n<=200,∑|S| <= 10^6 [题解] 首先找编辑距离有一个n^2的dp,由于发现只找小于等于8的,所以搜旁边16个状态即可. 复杂度O(n^2|S| * 16) # include <vector> # include <stdio.h> # include <iostream> # inc

NOIP模拟赛16

NOIP2017金秋冲刺训练营杯联赛模拟大奖赛第一轮Day2 期望得分:100+100+ =200+ 实际得分:100+40+70=210 T1天天寄快递 直接模拟,代码丢了...... T2天天和不可描述 splay可A 正解dfs+list #include<iostream> #include<list> #include<cstdio> using namespace std; list<char>s; char c; void getstr(boo

CCF考试认证模拟练习——数字排序

#include<iostream>#include<algorithm>using namespace std;struct node //定义结构体{ int num;//数据 int count;//出现的次数 计数};bool cmp(node a, node b)//排序{ if (a.count != b.count) return a.count>b.count; return a.num<b.num;}node a[1005];//node temp;i