-
题意
-
思路
对于每个 i i i,如果存在这样的 q q q和 w w w
q q q 是 i i i 左 边 第 一 个 比 a i a_i ai 大 的 下 标
w w w 是 i i i 右 边 第 一 个 比 a i a_i ai 大 的 下 标
那 么 容 易 证 明 q q q 和 w w w 有 边 , 也 就 是 构 成 了 环
证明
因 为 ( q , i ] ( q , i ] (q,i] 中 没 有 比 a i a_i ai 大 的 , [ i , w ) [ i , w ) [i,w) 中 没 有 比 a i a_i ai 大 的, a q a_q aq 和 a w a_w aw 就 是 [ q , w ] [ q , w ] [q,w] 中 最 大 和 次 大 , 必 定 连 边
证毕
Ⅰ . 方 法 一 : 组 合 构 造 \color{Red}Ⅰ.方法一:组合构造 Ⅰ.方法一:组合构造
但是直接考虑存在环的情况比较复杂,考虑不存在环的情况。不存在环,就是对于每个 i i i不能同时向左右连边,也就是有么只有左边有数比它大,要么只有右边有数比它大换言之就是要么左边都比自己小,要么右边都比自己小 这 其 实 构 成 了 一 个 单 峰 函 数 \color{Red}这其实构成了一个单峰函数 这其实构成了一个单峰函数前面一直递增到峰值 n n n,后面一直递减
图 Ⅱ . 方 法 二 : 思 维 , \color{Red}图Ⅱ.方法二:思维, 图Ⅱ.方法二:思维,
注 意 到 这 样 一 个 事 实 , 除 了 n 这 个 特 殊 的 数 注意到这样一个事实,除了n这个特殊的数注意到这样一个事实,除了n这个特殊的数
其 他 数 都 有 比 自 己 大 的 数 , 也 就 是 一 定 会 至 少 往 外 连 一 条 边 其他数都有比自己大的数,也就是一定会至少往外连一条边其他数都有比自己大的数,也就是一定会至少往外连一条边
这 样 就 就 必 定 会 连 n − 1 条 边 , 构 成 一 颗 树
在 树 的 基 础 上 , 无 论 多 加 任 何 一 条 边 都 会 形 成 环 在树的基础上,无论多加任何一条边都会形成环在树的基础上,无论多加任何一条边都会形成环
那 么 想 构 成 树 , 每 个 数 比 自 己 大 的 数 都 落 在 自 己 的 一 侧 ( 保 证 只 向 一 侧 连 边 ) 那么想构成树,每个数比自己大的数都落在自己的一侧(保证只向一侧连边)那么想构成树,每个数比自己大的数都落在自己的一侧(保证只向一侧连边)
再 次 得 到 结 论 , 前 面 递 增 到 n , 后 面 递 减 再次得到结论,前面递增到n,后面递减再次得到结论,前面递增到n,后面递减 -
代码
#include <bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
typedef long long ll;
int main() {
ll n;
scanf("%lld", &n);
ll ans1 = 1, ans2 = 1;
for (int i = 2; i <= n; i++) {
ans1 = ans1 * 2 % mod;
ans2 = ans2 * i % mod;
}
printf("%lld\n", ((ans2 - ans1) % mod + mod) % mod);
return 0;
}