Codeforces 490B Queue【模拟】

题意还是很好理解的,根据题目给出描述条件然后求出这串QUEUE

我的做法就是用两个数组 before[] 和 after[] 表示 ai 前面的前面的人的学号 和 ai 后面的后面的人的学号

ex[] 表示 ai 这个人在输入的时候出现的次数,这个数组用于当人数为奇数的时候,寻找第1个人学号,只要遍历一遍1 - 10^6即可

具体还是看代码吧 QAQ ,感觉代码还是比较好理解的。

【这道题目 RE 起码5次,真正原因是数组没有开到位 = = ,也真是觉得自己最近没有写代码了好弱..........

 1 //#pragma comment(linker, "/STACK:16777216") //for c++ Compiler
 2 #include <stdio.h>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <cmath>
 6 #include <stack>
 7 #include <queue>
 8 #include <vector>
 9 #include <algorithm>
10 #define ll long long
11 #define Max(a,b) (((a) > (b)) ? (a) : (b))
12 #define Min(a,b) (((a) < (b)) ? (a) : (b))
13 #define Abs(x) (((x) > 0) ? (x) : (-(x)))
14
15 using namespace std;
16
17 const int INF = 0x3f3f3f3f;
18 int a[200011], ex[1000011];
19 int before[1000011], after[1000011];
20
21 int main(){
22     int i, j ,k, t, n, m;
23     int uu, vv, cur, pos;
24     while(EOF != scanf("%d",&n)){
25         memset(ex, 0, sizeof(ex));
26         memset(before, -1, sizeof(before));
27         memset(after, -1, sizeof(after));
28         for(i = 1; i <= n; ++i){
29             scanf("%d%d",&uu,&vv);
30             after[uu] = vv;
31             before[vv] = uu;
32             if(uu == 0){
33                 a[2] = vv;
34             } else if(vv == 0){
35                 a[n - 1] = uu;
36             } else{
37                 ++ex[uu];
38                 ++ex[vv];
39             }
40         }
41         if(n % 2 == 0){
42             cur = a[2];
43             pos = 2;
44             while(pos != n){
45                 pos += 2;
46                 cur = a[pos] = after[cur];
47             }
48             cur = a[n - 1];
49             pos = n - 1;
50             while(pos != 1){
51                 pos -= 2;
52                 cur = a[pos] = before[cur];
53             }
54         } else{
55             cur = a[2];
56             pos = 2;
57             while(pos != n - 1){
58                 pos += 2;
59                 cur = a[pos] = after[cur];
60             }
61             for(i = 1; i <= 1000001; ++i){  //2 nums
62                 if(ex[i] == 1 && before[i] == -1){
63                     break;
64                 }
65             }
66             a[1] = i;
67             cur = a[1];
68             pos = 1;
69             while(pos != n){
70                 pos += 2;
71                 cur = a[pos] = after[cur];
72             }
73         }
74
75         for(i = 1; i <= n; ++i){
76             printf("%d ",a[i]);
77         }
78         printf("\n");
79     }
80     return 0;
81 }
82 /*
83 8
84 3 0
85 5 4
86 1 5
87 0 7
88 11 9
89 9 6
90 6 3
91 7 1
92 5
93 3 0
94 5 3
95 0 5
96 6 4
97 4 2
98 */
时间: 2024-10-06 18:49:39

Codeforces 490B Queue【模拟】的相关文章

codeforces 490B.Queue 解题报告

题目链接:http://codeforces.com/problemset/problem/490/B 题目意思:给出每个人 i 站在他前面的人的编号 ai 和后面的人的编号 bi.注意,排在第一个位置的人他前面是无人的!于是 a1 = 0.最后那个人的后面是木有人的,即 bn = 0.然后根据这些条件求出整个序列是如何排的,输出答案. 这条题卡了好久.........啊........啊........啊 首先很容易知道第二个位置的人的编号 和 倒数第二个人的位置编号.用一个aft[]数组记录

CodeForces 490B Queue

题意: 一个队列  每个人记录了自己前面和后面的人  求队列顺序 思路: 明显站在奇数位置上的人记录了前后两个偶数位置的人  站在偶数位置上的人同样 所以对于偶数位置  只要从0往后找就可以了 对于奇数位置  只要先找到第一个人  然后往后找就可以了 代码: #include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #inc

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.

Codeforces 38G Queue 伸展树

题目链接:点击打开链接 题意: 给定n个人来排队 每个人有2个参数,身份优先级和脸皮厚度 == 来的那个人会排到队尾 如果这个人的优先级比他前面那个人的优先级大就会和前面那个人交换位置. 交换一次脸皮厚度减1, 一直交换到队头或者脸皮厚度为0 交换完成后下一个人才会到来. 问: 队伍最后的情况(从队头到队尾依次输出每个人的编号) 思路:splay 维护子树的最小值. 插入时递归插入,若当前点是空就插这个位置. 然后就是裸的splay.. == #include <stdio.h> #inclu

queue+模拟 Codeforces Round #304 (Div. 2) C. Soldier and Cards

题目传送门 1 /* 2 题意:两堆牌,每次拿出上面的牌做比较,大的一方收走两张牌,直到一方没有牌 3 queue容器:模拟上述过程,当次数达到最大值时判断为-1 4 */ 5 #include <cstdio> 6 #include <iostream> 7 #include <algorithm> 8 #include <cstring> 9 #include <string> 10 #include <stack> 11 #in

CodeForces 545D Queue (排序模拟)

[题目链接]:click here~~ [题目大意]: 有n个人,每个人都有一个等待时间,如果对于当前的人来说总等待时间超过自己的等待时间,那么这个人就会失望,问换一下顺序,使失望的人最少,问最多有多少个人不失望. [思路]:排一下序然后加然后与当前的比较.如此.. 代码: /* * Problem: CodeForces 545D * Running time: 46MS * Complier: G++ * Author: herongwei * Create Time: 8:20 2015/

codeforces 591B Rebranding (模拟)

Rebranding Problem Description The name of one small but proud corporation consists of n lowercase English letters. The Corporation has decided to try rebranding - an active marketing strategy, that includes a set of measures to change either the bra

CodeForces 697B Barnicle 模拟

强行模拟 纪念一下…… 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 #include<math.h> 5 #include<string.h> 6 #include<string> 7 #include<map> 8 #include<vector> 9 #include<queue> 10 #define M(a

UVA - 133 The Dole Queue(模拟链表)

点击打开链接 n的人围成一个环,然后按逆时针编号1-n,一个人从1开始逆时针数k个数,另一个人从N开始顺时针数m个数,然后 数出来的两个人出列(两个人可能一样)出列,然后继续此过程,直到全部人都出列为止. 思路是用循环链表来模拟,注意 要分情况来讨论. #include <iostream> #include <cstdio> #include <cmath> #include <vector> #include <cstring> #inclu