传送门:戳这里
题解:将m次修改按R升序排序,dp[i]保存当i为最大值时,i的最右下标,由于R是升序的,只要i的最右下标不小于L就能修改,变成i+x
#include<bits/stdc++.h>
using namespace std;
const int MX = 1e4 + 5;
struct node {
int l, r, x;
bool operator< (const node& _A) const {
return r < _A.r;
}
} q[MX];
int dp[MX];
int main() {
int n, m;
while (~scanf ("%d%d", &n, &m) ) {
for (int i = 1; i <= m; i++) scanf ("%d%d%d", &q[i].l, &q[i].r, &q[i].x);
sort (q + 1, q + m + 1);
memset (dp, 0, sizeof (dp) );
for (int i = 1; i <= m; i++) {
int l = q[i].l, r = q[i].r, x = q[i].x;
for (int j = n - x; j; j--) {
if (dp[j] >= l) dp[j + x] = max (dp[j + x], dp[j]);
}
dp[x] = r;
}
vector<int>v;
for (int i = 1; i <= n; i++) if (dp[i]) v.push_back (i);
printf ("%d\n", v.size() );
for (int i = 0; i < v.size(); i++) printf ("%d%c", v[i], i == v.size() - 1 ? '\n' : ' ');
}
return 0;
}