Submission #1145116

#TimeUsernameProblemLanguageResultExecution timeMemory
1145116t9unkubjBodyguard (JOI21_bodyguard)C++20
0 / 100
7497 ms2162688 KiB
#ifdef t9unkubj

#define _GLIBCXX_DEBUG
#include"debug.cpp"
//#include"template_no_debug.h"
#else 
#define dbg(...) 199958
#endif

#pragma GCC optimize("O3")
using namespace std;
#include<bits/stdc++.h>
using ll=long long;
using ull=unsigned long long;
template<class T>using vc=vector<T>;
template<class T>using vvc=vc<vc<T>>;
#define rep(i,n) for(ll i=0;i<(ll)(n);i++)
#define REP(i,j,n) for(ll i=(j);i<(ll)(n);i++)
#define DREP(i,n,m) for(ll i=(n);i>=(m);i--)
#define drep(i,n) for(ll i=((n)-1);i>=0;i--)
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
template<class T,class F>
bool chmin(T &x, F y){
    if(x>y){
        x=y;
        return true;
    }
    return false;
}
template<class T, class F>
bool chmax(T &x, F y){
    if(x<y){
        x=y;
        return true;
    }
    return false;
}
double pass_time=0;
struct man{
    ll sx,sy;
    ll tx,ty;
    ll lsx,lsy;
    ll ltx,lty;
    ll c;
    int type(){
        return sx==tx;
    }
};
struct cht{
    using P=array<ll,3>;
    deque<P>dq;
    ll last_b;
    cht():last_b(-2e18){
        dq.push_back(P{(ll)2e9,(ll)-2e18,(ll)2e18});
    }
    ll eval(P a,ll x){
        return a[0]*x+a[1];
    }
    ll compare(P a,P b){

        return (b[1]-a[1]+a[0]-b[0]-1)/(a[0]-b[0]);
    }
    void add(ll a,ll b){
        assert(last_b<=b);
        chmax(last_b,b);
        while(dq.size()>=2&&(dq.back()[0]<=a||dq.back()[2]<=compare(dq.back(),P{a,b,0}))){
            dq.pop_back();
        }
        dq.push_back({a,b,compare(dq.back(),P{a,b,0})});    
    }
    ll get_max(ll x){
        int ac=0,wa=dq.size();
        while(wa-ac>1){
            int wj=ac+wa>>1;
            if(dq[wj][2]>=x)ac=wj;
            else wa=wj;
        }
        return eval(dq[ac],x);
    }
};
void solve(){
    int n,q;
    cin>>n>>q;
    vc<ll>t(n),a(n),b(n),c(n);
    rep(i,n)cin>>t[i]>>a[i]>>b[i]>>c[i];
    vc<man>mn;

    map<ll,ll>cx;
    rep(i,n){
        ll x1=a[i];
        ll y1=t[i];
        ll x2=b[i];
        ll y2=t[i]+abs(b[i]-a[i]);
        ll X1=x1+y1;
        ll Y1=y1-x1;
        ll X2=x2+y2;
        ll Y2=y2-x2;
        cx[X1]=cx[X2]=0;
        cx[Y1]=cx[Y2]=0;
        mn.push_back({X1,Y1,X2,Y2,0,0,0,0,c[i]/2});
    }
    cx[-2e9]=cx[-2e9]=0;
    cx[2e9+10]=cx[2e9+10]=0;
    int id=0;for(auto&[x,y]:cx)y=id++;

    vc<ll>X;
    for(auto&[x,y]:cx)X.push_back(x);
    rep(i,n){
        auto&[sx,sy,tx,ty,lsx,lsy,ltx,lty,c]=mn[i];
        lsx=cx[sx];
        lsy=cx[sy];
        ltx=cx[tx];
        lty=cx[ty];   
    }
    int m=cx.size();
    vvc<ll>dp(m,vc<ll>(m));
    vvc<ll>tx(m,vc<ll>(m));
    auto ty=tx;
    rep(i,n){
        //縦長
        if(mn[i].type()){
            REP(j,mn[i].lsy,mn[i].lty){
                chmax(ty[mn[i].lsx][j],mn[i].c);
            }
        }else{
            REP(j,mn[i].lsx,mn[i].ltx){
                chmax(tx[j][mn[i].lsy],mn[i].c);
            }
        }
    }
    
    vc<ll>ans(q);
    vc<array<ll,4>>event;
    rep(i,m)rep(j,m){
        event.push_back({X[i]+X[j],(ll)1e9,i,j});
    }

    rep(i,q){
        int x,p;
        cin>>p>>x;
        ll X1=x+p;
        ll Y1=-x+p;
        auto ix=lower_bound(all(X),X1)-X.begin();
        auto iy=lower_bound(all(X),Y1)-X.begin();
        
        event.push_back({X[ix]+X[iy],i,X1,Y1});
    }
    sort(rall(event));
    vc<cht>CHTX(m),CHTY(m);
    vc<ll>mx(m),my(m);
    for(auto&[v,i,x,y]:event){
        if(i==1e9){
            if(x+1<m)chmax(dp[x][y],dp[x+1][y]+tx[x][y]*(X[x+1]-X[x])),chmax(mx[x],mx[x+1]);
            if(y+1<m)chmax(dp[x][y],dp[x][y+1]+ty[x][y]*(X[y+1]-X[y])),chmax(my[y],my[y+1]);
            //if(x)CHTX[x].add(tx[x-1][y],dp[x][y]);
            //if(y)CHTY[y].add(ty[x][y-1],dp[x][y]);
            chmax(mx[x],dp[x][y]);
            chmax(my[y],dp[x][y]);
        }else{
            auto ix=lower_bound(all(X),x)-X.begin();
            auto iy=lower_bound(all(X),y)-X.begin();
            //ans[i]=max(CHTX[ix].get_max(X[ix]-x),CHTY[iy].get_max(X[iy]-y));
            chmax(ans[i],mx[ix]);
            chmax(ans[i],my[iy]);
        }
    }
    rep(i,q)cout<<ans[i]<<"\n";
}

signed main(){
#ifdef t9unkubj
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
    cin.tie(0)->sync_with_stdio(0);
    pass_time=clock();
    int t=1;
    //cin>>t;
    while(t--)solve();
    pass_time=clock()-pass_time;
    dbg(pass_time/CLOCKS_PER_SEC);
}
/*
3 2
 3 1 5 2
 1 4 1 4
 4 2 4 4
 2 2
 6 3
*/
#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...