Mujin Contest 2017 A. Robot Racing

题目大意

数轴正半轴上有$n$个机器人,每次可以把一个位置为$x_i$的机器人移动到$x_i-1$或者$x_i-2$,如果那个位置为空的话,当$x_i\le 0$时意味着机器人到达终点,问机器人到达终点的顺序的方案数。

简要题解

先考虑Naive的做法,枚举排列然后判断是否可行,会发现一个机器人能被首先移动到终点,当且仅当对于在它前面的所有机器人,第$k$个的位置$x_k$不小于$2k-1$。对于能被首先移动到终点的机器人,移动任意一个对剩下的机器人移动回终点的影响是相同的(因为可以看做移动完一个后把后面可以移动回去的都往前挪),于是用个栈维护每次能直接移动回去的机器人数量,连乘起来就好。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 namespace my_header {
 4 #define pb push_back
 5 #define mp make_pair
 6 #define pir pair<int, int>
 7 #define vec vector<int>
 8 #define pc putchar
 9 #define clr(t) memset(t, 0, sizeof t)
10 #define pse(t, v) memset(t, v, sizeof t)
11 #define bl puts("")
12 #define wn(x) wr(x), bl
13 #define ws(x) wr(x), pc(' ')
14     const int INF = 0x3f3f3f3f;
15     typedef long long LL;
16     typedef double DB;
17     inline char gchar() {
18         char ret = getchar();
19         for(; (ret == '\n' || ret == '\r' || ret == ' ') && ret != EOF; ret = getchar());
20         return ret; }
21     template<class T> inline void fr(T &ret, char c = ' ', int flg = 1) {
22         for(c = getchar(); (c < '0' || '9' < c) && c != '-'; c = getchar());
23         if (c == '-') { flg = -1; c = getchar(); }
24         for(ret = 0; '0' <= c && c <= '9'; c = getchar())
25             ret = ret * 10 + c - '0';
26         ret = ret * flg; }
27     inline int fr() { int t; fr(t); return t; }
28     template<class T> inline void fr(T&a, T&b) { fr(a), fr(b); }
29     template<class T> inline void fr(T&a, T&b, T&c) { fr(a), fr(b), fr(c); }
30     template<class T> inline char wr(T a, int b = 10, bool p = 1) {
31         return a < 0 ? pc('-'), wr(-a, b, 0) : (a == 0 ? (p ? pc('0') : p) : 
32             (wr(a/b, b, 0), pc('0' + a % b)));
33     }
34     template<class T> inline void wt(T a) { wn(a); }
35     template<class T> inline void wt(T a, T b) { ws(a), wn(b); }
36     template<class T> inline void wt(T a, T b, T c) { ws(a), ws(b), wn(c); }
37     template<class T> inline void wt(T a, T b, T c, T d) { ws(a), ws(b), ws(c), wn(d); }
38     template<class T> inline T gcd(T a, T b) {
39         return b == 0 ? a : gcd(b, a % b); }
40     template<class T> inline T fpw(T b, T i, T _m, T r = 1) {
41         for(; i; i >>= 1, b = b * b % _m)
42             if(i & 1) r = r * b % _m;
43         return r; }
44 };
45 using namespace my_header;
46 
47 const int MOD = 1e9 + 7;
48 int stk[111111], top;
49 int n;
50 
51 int main() {
52 #ifdef lol
53     freopen("A.in", "r", stdin);
54     freopen("A.out", "w", stdout);
55 #endif
56     fr(n);
57     int ans = 1;
58     for (int i = 1; i <= n; ++i) {
59         int x = fr();
60         if (top >= 1 && top * 2 - 1 > stk[top]) {
61             ans = 1LL * ans * top % MOD;
62             --top;
63         }
64         stk[++top] = x;
65     }
66     for (; top > 1; --top)
67         ans = 1LL * ans * top % MOD;
68     wt(ans);
69 
70 
71     return 0;
72 }

 

posted @ 2017-02-26 22:55  ichneumon  阅读(272)  评论(0编辑  收藏  举报