Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <map>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <unordered_map>
- #include <numeric>
- #include <iomanip>
- using namespace std;
- #define pii pair<int , int>
- #define ll long long
- #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
- const long long dx[4] = {1, 0, -1, 0}, dy[4] = {0, -1, 0, 1};
- const long long dl[2] = {1, -1};
- const long long MOD = 1000000007;
- const long long MAXN = 10005;
- int t;
- int n, w;
- vector<int> inside, outside;
- int dp[MAXN][2][2];
- void init(){
- inside.clear();
- outside.clear();
- cin >> n >> w;
- inside.push_back(-1);
- for(int x, i = 0; i < n; i++){
- cin >> x;
- inside.push_back(x);
- }
- outside.push_back(-1);
- for(int x, i = 0; i < n; i++){
- cin >> x;
- outside.push_back(x);
- }
- inside[0] = inside.back();
- outside[0] = outside.back();
- }
- int DP1(){
- for(int i = 0; i <= n; i++){
- dp[i][0][0] = 2e9;
- dp[i][0][1] = 2e9;
- dp[i][1][0] = 2e9;
- dp[i][1][1] = 2e9;
- }
- // idx, inside, outside
- dp[1][1][0] = 1;
- dp[1][0][1] = 1;
- dp[0][1][1] = 0;
- if(inside[1] + outside[1] <= w){
- dp[1][1][1] = 1;
- }
- else{
- dp[1][1][1] = 2;
- }
- for(int i = 2; i <= n; i++){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
- if(inside[i] + inside[i - 1] <= w){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
- }
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
- if(outside[i] + outside[i - 1] <= w){
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
- }
- dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
- if(inside[i] + outside[i] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
- }
- if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
- }
- }
- return dp[n][1][1];
- }
- int DP2(){
- if(inside[0] + inside[1] > w){
- return 2e9;
- }
- for(int i = 0; i <= n; i++){
- dp[i][0][0] = 2e9;
- dp[i][0][1] = 2e9;
- dp[i][1][0] = 2e9;
- dp[i][1][1] = 2e9;
- }
- dp[1][1][0] = 1;
- dp[1][1][1] = 2;
- for(int i = 2; i <= n; i++){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
- if(inside[i] + inside[i - 1] <= w){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
- }
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
- if(outside[i] + outside[i - 1] <= w){
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
- }
- dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
- if(inside[i] + outside[i] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
- }
- if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
- }
- }
- return dp[n][0][1];
- }
- int DP3(){
- if(outside[0] + outside[1] > w){
- return 2e9;
- }
- for(int i = 0; i <= n; i++){
- dp[i][0][0] = 2e9;
- dp[i][0][1] = 2e9;
- dp[i][1][0] = 2e9;
- dp[i][1][1] = 2e9;
- }
- dp[1][0][1] = 1;
- dp[1][1][1] = 2;
- for(int i = 2; i <= n; i++){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
- if(inside[i] + inside[i - 1] <= w){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
- }
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
- if(outside[i] + outside[i - 1] <= w){
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
- }
- dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
- if(inside[i] + outside[i] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
- }
- if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
- }
- }
- return dp[n][1][0];
- }
- int DP4(){
- if(inside[0] + inside[1] > w or outside[0] + outside[1] > w){
- return 2e9;
- }
- for(int i = 0; i <= n; i++){
- dp[i][0][0] = 2e9;
- dp[i][0][1] = 2e9;
- dp[i][1][0] = 2e9;
- dp[i][1][1] = 2e9;
- }
- dp[1][1][1] = 2;
- for(int i = 2; i <= n; i++){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][1][1] + 1);
- if(inside[i] + inside[i - 1] <= w){
- dp[i][1][0] = min(dp[i][1][0], dp[i - 1][0][1] + 1);
- }
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][1] + 1);
- if(outside[i] + outside[i - 1] <= w){
- dp[i][0][1] = min(dp[i][0][1], dp[i - 1][1][0] + 1);
- }
- dp[i][1][1] = min(dp[i][1][1], min(dp[i][0][1] + 1, dp[i][1][0] + 1));
- if(inside[i] + outside[i] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 1][1][1] + 1);
- }
- if(inside[i] + inside[i - 1] <= w && outside[i] + outside[i - 1] <= w){
- dp[i][1][1] = min(dp[i][1][1], dp[i - 2][1][1] + 2);
- }
- }
- return dp[n - 1][1][1];
- }
- void solve(){
- init();
- if(n == 1){
- cout << DP1() << "\n";
- return;
- }
- cout << min(min(DP1(), DP2()), min(DP3(), DP4())) << "\n";
- }
- int main() {
- FAST;
- cin >> t;
- for(int i = 0; i < t; i++){
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement