1873F - Money Trees - CodeForces Solution


greedy greedy greedy math two pointers

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>
const int N = 1e5 + 10;
typedef long long ll;
#define int long long
#define endl '\n'
#define INF 0x7fffffff
#define fi first
#define se second
#define pii pair<int, int>
#define YES                                                                                                            \
    {                                                                                                                  \
        cout << "YES" << endl;                                                                                         \
        return;                                                                                                        \
    }
#define NO                                                                                                             \
    {                                                                                                                  \
        cout << "NO" << endl;                                                                                          \
        return;                                                                                                        \
    }
 
using namespace std;
 
// struct node
// {
//
// };
//
// bool cmp(const node& x,node& y)
// {
//     return x.<y.;
// }
 
void solve()
{
    int n, m;
    cin >> n >> m;
    vector<int> a(n + 1, INT_MAX);
    vector<int> b(n + 1, 0);
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i];
    }
    for (int i = 1; i <= n; i++)
    {
        cin >> b[i];
    }
 
    vector<pair<int, int>> p;
 
    for (int i = 1; i <= n; i++)
    {
        if (i + 1 <= n && b[i] % b[i + 1] == 0)
        {
            int j = i;
            while (j + 1 <= n && b[j] % b[j + 1] == 0)
            {
                j++;
            }
            p.push_back({i, j});
            i = j;
        }
    }
    int len = 0;
    for (auto x : p)
    {
        int l = x.first, r = x.first;
        int temp = a[r];
        while (r <= x.second)
        {
            if (temp <= m)
                len = max(len, r - l + 1);
            r++;
            if (r <= x.second)
                temp += a[r];
            else
                break;
            while (temp > m && l <= r)
            {
                temp -= a[l];
                l++;
            }
        }
 
        if (temp <= m)
            len = max(len, r - l);
    }
    if (len == 0)
    {
    	int x = *min_element(a.begin(),a.end());
        if (x <= m) cout<<1<<endl;
        else cout<<0<<endl;
    }
    else
    {
        cout << len << endl;
    }
}
 
signed main()
{
    cin.tie(0);
    cout.tie(0);
    ios::sync_with_stdio(0);
    int __ = 1;
    cin >> __;
    while (__--)
        solve();
}


Comments

Submit
0 Comments
More Questions

543. Diameter of Binary Tree
124. Binary Tree Maximum Path Sum
1465. Maximum Area of a Piece of Cake After Horizontal and Vertical Cuts
501A - Contest
160A- Twins
752. Open the Lock
1535A - Fair Playoff
1538F - Interesting Function
1920. Build Array from Permutation
494. Target Sum
797. All Paths From Source to Target
1547B - Alphabetical Strings
1550A - Find The Array
118B - Present from Lena
27A - Next Test
785. Is Graph Bipartite
90. Subsets II
1560A - Dislike of Threes
36. Valid Sudoku
557. Reverse Words in a String III
566. Reshape the Matrix
167. Two Sum II - Input array is sorted
387. First Unique Character in a String
383. Ransom Note
242. Valid Anagram
141. Linked List Cycle
21. Merge Two Sorted Lists
203. Remove Linked List Elements
733. Flood Fill
206. Reverse Linked List