/* * TODO : if answer = 0 behaviour of code? */ #include using namespace std; #define int long long const int maxn = 2e3 + 10; const int inf = 2e15; int n, T; vector vc[maxn]; int dpU[maxn][maxn]; int dpD[maxn][maxn]; int32_t main(){ int t; cin >> t; while (t--){ for(int i = 0; i < maxn; i++) vc[i].clear(); memset(dpU, 63, sizeof dpU); memset(dpD, 63, sizeof dpD); memset(dpU[0], 0, sizeof dpU[0]); memset(dpD[0], 0, sizeof dpD[0]); cin >> n >> T; for(int y, s, e, i = 0; i < n; i++) cin >> y >> s >> e, vc[y].push_back(e); for(int i = 0; i < maxn; i++) sort(vc[i].begin(), vc[i].end()); // for (int i = 1; i <= n; i++) // for (int j = maxn - 2; j >= 0; j--){ // dpU[i][j] = dpU[i][j+1] + 2; // for (int l = 0; l < min(i, (int)vc[j].size()); l++) // dpU[i][j] = min(dpU[i][j], dpU[i-l-1][j+1] + 2*((i-l-1)!=0) + vc[j][l]*2); // } for (int i = 1; i <= n; i++) for(int j = 0; j < maxn; j++){ if(j != 0) dpD[i][j] = dpD[i][j-1]; for (int l = 0; l < min(i, (int)vc[j].size()); l++) dpD[i][j] = min(dpD[i][j], ((j==0) ? ((i-l-1)!=0)*inf : dpD[i-l-1][j-1]) + vc[j][l]*2); } int low = 0, high = n + 1; while(high - low > 1){ int mid = (low + high) >> 1; int ans = inf; for (int x = 0; x + 1 < maxn; x++) for (int l = 0; l < min(mid, (int)vc[x].size()); l++) // for (int j = 0; j <= mid-l-1; j++) { int j = 0; int y = vc[x][l]; int cur = x + y; //cur += dpU[j][x+1] + (j != 0) * 2; int z = mid - l - 1 - j; if(x > 0) cur += dpD[z][x-1]; else if(z != 0) continue; ans = min(ans, cur); } if(ans > T) high = mid; else low = mid; } cout << low << '\n'; } }