Problem p02549 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>

#pragma region Macro
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define SORT(v) sort(v.begin(), v.end())
#define pb(a) push_back(a)
#define eb(a) emplace_back(a)
#define vi vector<int>
#define vvi vector<vector<int>>
#define chmax(x, y) (x = max(x, y))
#define chmin(x, y) (x = min(x, y))

using namespace std;
typedef long long ll;
typedef pair<int, int> P;
#pragma endregion

#define MOD 998244353

void solve() {
#define int ll
  // ここに処理を記述
  // コンパイル時はエイリアス「gpp」--> c++17でコンパイル
  int n, k;
  cin >> n >> k;

  vector<P> rng;
  rep(i, k) {
    int l, r;
    cin >> l >> r;
    r++;
    rng.eb(make_pair(l, r));
  }

  vi dp(n);
  dp[0] = 1;
  dp[1] = -1;

  rep(i, n) {
    // a[i] = f[i] - f[i-1]と定義する
    // a[i]の更新は 各jについて
    // a[i + l[j]] <-- a[i + l[j]] + f[i]
    // a[i + r[j] + 1] <-- a[i + r[j] + 1] - f[i]
    // とすると
    // f[i] = f[i+1] + a[i]で復元できる
    if (i > 0) {
      dp[i] += dp[i - 1];
      dp[i] = (dp[i] % MOD + MOD) % MOD;
    }
    rep(j, k) {
      int l, r;
      tie(l, r) = rng[j];
      if (i + l < n) {
        dp[i + l] += dp[i];
        dp[i + l] = (dp[i + l] % MOD + MOD) % MOD;
      }
      if (i + r < n) {
        dp[i + r] -= dp[i];
        dp[i + r] = (dp[i + r] % MOD + MOD) % MOD;
      }
    }
  }

  cout << dp[n - 1] << endl;

  /*
  int l,r;
  vi s;
  rep(i,k){
          cin >> l >> r;
          FOR(j,l,r+1){
                  s.eb(j);
          }
  }
  sort(s.begin(),s.end());

  // dp
  vi dp(n+1,-1);
  dp[1] = 1;
  // 配るDP
  FOR(i,1,n+1){
          // そこにたどり着く方法がないならスキップ
          if(dp[i] == -1) continue;
          // 現在位置からいけるところを探索
          rep(j, s.size()){
                  int ele = s[j];
                  // マスからはみ出るなら終了
                  if(ele + i > n) break;
                  // はみ出ないなら今までのルートを配る
                  if(dp[i + ele] == -1) dp[i + ele] = 0;
                  dp[i + ele] += dp[i];
                  dp[i + ele] = dp[i + ele] % MOD;
          }
  }

  if(dp[n] == -1) cout << "0" << endl;
  else cout << dp[n] << endl;
  */
}

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(15);

  solve();
  return 0;
}

Error: TLE

Fixed submission:

#include <bits/stdc++.h>

#pragma region Macro
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define SORT(v) sort(v.begin(), v.end())
#define pb(a) push_back(a)
#define eb(a) emplace_back(a)
#define vi vector<int>
#define vvi vector<vector<int>>
#define chmax(x, y) (x = max(x, y))
#define chmin(x, y) (x = min(x, y))

using namespace std;
typedef long long ll;
typedef pair<int, int> P;
#pragma endregion

#define MOD 998244353

void solve() {
#define int ll
  // ここに処理を記述
  // コンパイル時はエイリアス「gpp」--> c++17でコンパイル
  int n, k;
  cin >> n >> k;

  int l, r;
  vi s;
  rep(i, k) {
    cin >> l >> r;
    FOR(j, l, r + 1) { s.eb(j); }
  }
  sort(s.begin(), s.end());

  // dp
  vi dp(n + 1, -1);
  dp[1] = 1;
  // 配るDP
  FOR(i, 1, n + 1) {
    // そこにたどり着く方法がないならスキップ
    if (dp[i] == -1)
      continue;
    // 現在位置からいけるところを探索
    rep(j, s.size()) {
      int ele = s[j];
      // マスからはみ出るなら終了
      if (ele + i > n)
        break;
      // はみ出ないなら今までのルートを配る
      if (dp[i + ele] == -1)
        dp[i + ele] = 0;
      dp[i + ele] += dp[i];
      dp[i + ele] = dp[i + ele] % MOD;
    }
  }

  if (dp[n] == -1)
    cout << "0" << endl;
  else
    cout << dp[n] << endl;
}

signed main() {
  cin.tie(0);
  ios::sync_with_stdio(false);
  cout << fixed << setprecision(15);

  solve();
  return 0;
}