Hướng dẫn giải của Bedao Regular Contest 11 - H2O


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: bedao

Subtask 1 (50%) :
  • Duyệt trâu từ ~l~ đến ~r~ ,độ phức tạp ~O(N * Q)~.
Subtask 2 (50%) :
  • Đầu tiên ta khởi tạo 4 mảng :

    • ~D[i]~ là khoảng cách thùng nước thứ ~i~ đến thùng nước thứ ~i + 1~ ~(D[n] = 0)~ .
    • ~SumW[i]~ là tổng các ~W[j]~ với ~(j > i)~.
    • ~SumD[i]~ là tổng các ~D[j]~ với ~(j > i)~.
    • ~SumWS[i]~ là tổng các ~W[j] * SumD[j]~ với ~(j > i)~.

Ta có công thức tính chi phí vận chuyển các thùng nước có chỉ số từ ~L~ đến ~R - 1~ về ~R~ là :

  • ~sumWS[L] − sumWS[R]−sumD[R] ∗ (sumW[L] − sumW[R])~.

Code mẫu

#include <bits/stdc++.h>

#define fi first
#define se second
#define For(i, a, b) for (int i=a;i<=b;++i)
#define Ford(i, a, b) for(int i=a;i>=b;--i)

using namespace std;

typedef long long ll;
typedef pair<int, int> ii;
typedef array<int, 3> arr;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<ii> vii;

const int N = 1e6 + 5;

ll x[N], w[N], sw[N], sxw[N];

void solve()
{
    int n; cin >> n;
    For(i, 1, n) {
        cin >> x[i] >> w[i];
        sw[i] = sw[i - 1] + w[i];
        sxw[i] = sxw[i - 1] + x[i] * w[i];
    }
    int q; cin >> q;
    while (q--) {
        int l, r; cin >> l >> r;

        assert(l <= r);
        r--;

        cout << x[r + 1] * (sw[r] - sw[l - 1]) - (sxw[r] - sxw[l - 1]) << "\n";
    }
}

int main()
{
//  freopen(".inp","r",stdin);
//  freopen(".out","w",stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);

    solve();

    return 0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.