結果
問題 | No.801 エレベーター |
ユーザー |
👑 ![]() |
提出日時 | 2019-03-17 22:47:33 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 492 ms / 2,000 ms |
コード長 | 2,975 bytes |
コンパイル時間 | 1,294 ms |
コンパイル使用メモリ | 129,360 KB |
最終ジャッジ日時 | 2025-01-06 23:11:40 |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include <algorithm>#include <cassert>#include <cctype>#include <chrono>#define _USE_MATH_DEFINES#include <cmath>#include <cstdio>#include <cstring>#include <ctime>#include <deque>#include <functional>#include <iostream>#include <map>#include <queue>#include <random>#include <set>#include <sstream>#include <string>#include <tuple>#include <vector>using namespace std;#define FOR(i,m,n) for(int i=(m);i<(n);++i)#define REP(i,n) FOR(i,0,n)#define ALL(v) (v).begin(),(v).end()const int INF = 0x3f3f3f3f, MOD = 1000000007;const long long LINF = 0x3f3f3f3f3f3f3f3fLL;/*-----------------------------------------*/int main() {cin.tie(0); ios::sync_with_stdio(false);// freopen("input.txt", "r", stdin);int n, m, k; cin >> n >> m >> k;vector<int> l(m), r(m); REP(i, m) cin >> l[i] >> r[i];vector<vector<int> > shita(n + 1), ue(n + 1);REP(i, m) {shita[l[i]].emplace_back(i);if (r[i] + 1 <= n) ue[r[i] + 1].emplace_back(i);}vector<vector<int> > up(n + 1), down(n + 1);REP(i, m) {up[r[i]].emplace_back(i);down[l[i] - 1].emplace_back(i);}vector<vector<long long> > dp(k + 1, vector<long long>(n + 1, 0));dp[0][1] = 1;REP(i, k) {vector<long long> cum(n + 1, 0);FOR(j, 1, n + 1) (cum[j] += (cum[j - 1] + dp[i][j]) % MOD) %= MOD;int cnt = 0;long long tmp = 0;FOR(j, 1, n + 1) {cnt += shita[j].size() - ue[j].size();(tmp += dp[i][j] * cnt % MOD) %= MOD;// cout << i + 1 << ' ' << j << " | " << shita[j].size() << '\n';for (int e : ue[j]) {tmp -= (cum[r[e]] - cum[l[e] - 1]) % MOD;(tmp += MOD) %= MOD;}(dp[i + 1][j] += tmp) %= MOD;// cout << i + 1 << ' ' << j << " : " << dp[i + 1][j] << '\n';}vector<long long> muc(n + 1, 0);muc[n] = dp[i][n];for (int j = n - 1; j > 0; --j) (muc[j] += (muc[j + 1] + dp[i][j]) % MOD) %= MOD;cnt = 0;tmp = 0;for (int j = n; j > 0; --j) {cnt += up[j].size() - down[j].size();(tmp += dp[i][j] * cnt % MOD) %= MOD;for (int e : down[j]) {tmp -= (muc[l[e]] - (r[e] + 1 <= n ? muc[r[e] + 1] : 0)) % MOD;(tmp += MOD) %= MOD;}(dp[i + 1][j] += tmp) %= MOD;}cnt = 0;FOR(j, 1, n + 1) {cnt += shita[j].size() - ue[j].size();dp[i + 1][j] -= dp[i][j] * cnt % MOD;(dp[i + 1][j] += MOD) %= MOD;}}cout << dp[k][n] << '\n';return 0;// vector<vector<long long> > to(n + 1, vector<long long>(n + 1, 0));// FOR(i, 1, n + 1) FOR(j, 1, n + 1) {// }// vector<vector<long long> > dp(k + 1, vector<long long>(n + 1, 0));// dp[0][1] = 1;// REP(i, k) FOR(j, 1, n + 1) {// REP(x, m) if (l[x] <= j && j <= r[x]) {// FOR(y, l[x], r[x] + 1) (dp[i + 1][y] += dp[i][j]) %= MOD;// }// }// cout << dp[k][n] << '\n';return 0;}