Submission #1294710

#TimeUsernameProblemLanguageResultExecution timeMemory
1294710Ice_manBodyguard (JOI21_bodyguard)C++20
42 / 100
25083 ms1659816 KiB
/**
 ____    ____    ____    __________________    ____    ____    ____
||I ||  ||c ||  ||e ||  ||                ||  ||M ||  ||a ||  ||n ||
||__||  ||__||  ||__||  ||________________||  ||__||  ||__||  ||__||
|/__\|  |/__\|  |/__\|  |/________________\|  |/__\|  |/__\|  |/__\|

*/

#include <iostream>

#include <vector>
#include <algorithm>


#define maxn 500005
#define PB push_back
#define X first
#define Y second



typedef long long ll;
typedef std::pair <ll, ll> pii;
typedef std::pair <ll, ll> pll;
typedef std::pair <ll, ll> pil;
typedef std::pair <ll, ll> pli;


const ll mod = 1e9 + 7;
const ll INF = 1e9;


int get_id(ll x , std::vector <ll> &cords)
{
    return (int)(std::lower_bound(cords.begin() , cords.end() , x) - cords.begin());
}

void read_solve()
{
    int n , q;
    std::cin >> n >> q;


    std::vector <std::pair <ll , std::pair <pii , pii> > > v;
    std::vector <ll> cords = {(ll)1e12};

    for(int i = 0; i < n; i++)
    {
        ll t , l , r , c;

        std::cin >> t >> l >> r >> c;

        ll x = t + llabs(r - l);
        pii poms = {t - l , t + l};
        pii pomt = {x - r , x + r};

        v.PB({c , {poms , pomt}});

        cords.PB(v[i].Y.X.X);
        cords.PB(v[i].Y.X.Y);
        cords.PB(v[i].Y.Y.X);
        cords.PB(v[i].Y.Y.Y);
    }

    std::sort(cords.begin() , cords.end());
    cords.erase(std::unique(cords.begin() , cords.end()) , cords.end());

    int sz = cords.size();

    std::vector <std::vector <ll> > mx(sz , std::vector <ll>(sz , 0));
    std::vector <std::vector <ll> > my(sz , std::vector <ll>(sz , 0));
    std::vector <std::vector <ll> > dp(sz , std::vector <ll>(sz , 0));


    for(int i = 0; i < n; i++)
    {
        int au = get_id(v[i].Y.X.X , cords);
        int av = get_id(v[i].Y.X.Y , cords);
        int bu = get_id(v[i].Y.Y.X , cords);
        int bv = get_id(v[i].Y.Y.Y , cords);

        if(v[i].Y.X.X == v[i].Y.Y.X)
            for(int j = av; j < bv; j++)
                my[au][j] = v[i].X;
        else
            for(int j = au; j < bu; j++)
                mx[j][av] = v[i].X;
    }


    for(int i = sz - 1; i >= 0; i--)
        for(int j = sz - 1; j >= 0; j--)
        {
            if(i + 1 < sz)
                dp[i][j] = std::max(dp[i][j] , dp[i + 1][j] + (ll)(cords[i + 1] - cords[i]) * mx[i][j]);

            if(j + 1 < sz)
                dp[i][j] = std::max(dp[i][j] , dp[i][j + 1] + (ll)(cords[j + 1] - cords[j]) * my[i][j]);
        }

    while(q--)
    {
        ll pp , dx;
        std::cin >> pp >> dx;

        int idu = get_id(pp - dx , cords);
        int idv = get_id(pp + dx , cords);

        ll ans = dp[idu][idv];

        if(idu > 0)
            for(int i = idv; i < sz; i++)
                ans = std::max(ans , dp[idu][i] + (ll)(cords[idu] - pp + dx) * mx[idu - 1][i]);

        if(idv > 0)
            for(int i = idu; i < sz; i++)
                ans = std::max(ans , dp[i][idv] + (ll)(cords[idv] - pp - dx) * my[i][idv - 1]);

        std::cout << ans / 2 << "\n";
    }
}









int main()
{
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(nullptr);

    ll tests = 1;
    //std::cin >> tests;
    while(tests--)
    {
        read_solve();
    }



    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...