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

#include <algorithm>
#include <bits/stdc++.h>
#include <iostream>
#include <math.h>
#include <numeric>
#include <string>
#include <vector>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define chmax(x, y) x = max(x, y)
int INF = 1e9;
ll LINF = 1e18;

// int main(){
// 	ll n;
// 	int x,m;cin >> n >> x >> m;
// 	vector<int> res(100005);
// 	ll temp = x;
// 	ll len = 1;
// 	bool flag = false;
// 	while(true){
// 		temp %= m;
// 		cout << temp << endl;
// 		if(temp == 0) flag = true;
// 		if(res[temp]!=0) break;
// 		res[temp]++;
// 		temp *= temp;
// 		len++;
// 	}
// 	len--;
// 	ll ans = 0;
// 	if(flag){
// 		rep(i,m) if(res[i]!=0) ans += i;
// 		cout << ans << endl;
// 		return 0;
// 	}
// 	rep(i,m) if(res[i]!=0) ans += i;
// 	cout << ans << endl;
// 	ans += (n-len)*temp;
// 	//rep(i,20) if(res[i]!=0) cout << len << endl;
// 	// temp = x;
// 	// rep(i,n%len){
// 	// 	temp %= m;
// 	// 	ans += temp;
// 	// 	temp *= temp;
// 	// }
// 	cout << ans << endl;

// }

int main() {
  int mod = 998244353;
  int n, k;
  cin >> n >> k;
  vector<P> step(k);
  vector<ll> ans(200050), cum(200050);
  rep(i, k) {
    int l, r;
    cin >> l >> r;
    step[i] = make_pair(l, r);
  }
  cum[1] = 1;
  ans[1] = 1;
  for (int i = 2; i <= n; i++) {
    for (P p : step) {
      if (i - p.first < 0)
        continue;
      int li = i - p.second;
      int ri = i - p.first;
      li = max(li, 1);
      ans[i] += cum[ri] - cum[li - 1];
      ans[i] %= mod;
      if (ans[i] < 0)
        ans[i] += mod;
    }
    cum[i] = (cum[i - 1] + ans[i]) % mod;
  }
  // rep(i,n+1)cout << ans[i] << endl;
  cout << ans[n] << endl;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <bits/stdc++.h>
#include <iostream>
#include <math.h>
#include <numeric>
#include <string>
#include <vector>
#define rep(i, n) for (int i = 0; i < (n); ++i)
using namespace std;
using ll = long long;
using P = pair<int, int>;
#define chmax(x, y) x = max(x, y)
int INF = 1e9;
ll LINF = 1e18;

// int main(){
// 	ll n;
// 	int x,m;cin >> n >> x >> m;
// 	vector<int> res(100005);
// 	ll temp = x;
// 	ll len = 1;
// 	bool flag = false;
// 	while(true){
// 		temp %= m;
// 		cout << temp << endl;
// 		if(temp == 0) flag = true;
// 		if(res[temp]!=0) break;
// 		res[temp]++;
// 		temp *= temp;
// 		len++;
// 	}
// 	len--;
// 	ll ans = 0;
// 	if(flag){
// 		rep(i,m) if(res[i]!=0) ans += i;
// 		cout << ans << endl;
// 		return 0;
// 	}
// 	rep(i,m) if(res[i]!=0) ans += i;
// 	cout << ans << endl;
// 	ans += (n-len)*temp;
// 	//rep(i,20) if(res[i]!=0) cout << len << endl;
// 	// temp = x;
// 	// rep(i,n%len){
// 	// 	temp %= m;
// 	// 	ans += temp;
// 	// 	temp *= temp;
// 	// }
// 	cout << ans << endl;

// }

int main() {
  int mod = 998244353;
  int n, k;
  cin >> n >> k;
  vector<int> width;
  rep(i, k) {
    int l, r;
    cin >> l >> r;
    for (int j = l; j <= r; j++)
      width.push_back(j);
  }
  sort(width.begin(), width.end());

  vector<int> dp(200050, 0);
  dp[1] = 1;
  for (int i = 1; i <= n; i++) {
    for (int v : width) {
      if (v + i > n || dp[i] == 0)
        break;
      dp[i + v] += dp[i];
      dp[i + v] %= mod;
    }
  }
  cout << dp[n] << endl;
}