Submission #1332143

#TimeUsernameProblemLanguageResultExecution timeMemory
1332143tung04885Walk (CEOI06_walk)C++20
0 / 100
36 ms5608 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 100100
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define __buitin_popcount __builtin_popcountll
#define BIT(x,i) (((x)>>(i))&1ll)
#define MASK(i) (1ll<<(i))
#define left __left
#define right __right

template<class X,class Y> bool maximize(X &x,Y y)
{
    if(x<y)
    {
        x=y;
        return 1;
    }
    return 0;
}

template<class X,class Y> bool minimize(X &x,Y y)
{
    if(y<x)
    {
        x=y;
        return 1;
    }
    return 0;
}

const int inf=1e9+412009;
const ll INF=2e18+412009;

struct POINT
{
    int x,y;
    int id;

    void input(int i=0)
    {
        cin>>x>>y;
        id=i;
    }

    bool operator < (POINT other) const
    {
        return x==other.x ? y<other.y : x<other.x;
    }
};

double LEN(POINT a,POINT b)
{
    return abs(a.x-b.x)+abs(a.y-b.y);
}

struct RECT
{
    int top=0,bot=0,left=0,right=0;
    int id=0;

    void input(int i=0)
    {
        id=i;

        int x,y,u,v;

        cin>>x>>y>>u>>v;

        top=max(y,v);

        bot=min(y,v);

        right=max(x,u);

        left=min(x,u);
    }

    bool operator < (RECT other) const
    {
        return left<other.left;
    }
};

POINT T;
int n;
RECT a[MAX];

void nhap()
{
    T.input(1);

    int tmp;

    cin>>tmp;

    for(int i=1;i<=tmp;i++)
    {
        RECT vl;vl.input();

        if(T.x<=vl.right) continue;

        a[++n]=vl;
    }
}

ll dist[MAX][2]={};
pii trace[MAX][2]={};
set<pii> s;

void solve()
{
    memset(dist,0x3f,sizeof(dist));

    sort(a+1,a+n+1);

    s.insert({0,0});
    dist[0][0]=0;

    for(int i=1;i<=n;i++)
    {
        for(auto it=s.lower_bound({a[i].bot,-inf});it!=s.end()&&it->fi<=a[i].top;)
        {
            int id=abs(it->se),type=it->se>0;

            if(minimize(dist[i][0],a[i].left-a[id].left+abs(a[i].bot-1-it->fi)+dist[id][type])) trace[i][0]=*it;

            if(minimize(dist[i][1],a[i].left-a[id].left+abs(a[i].top+1-it->fi)+dist[id][type])) trace[i][1]=*it;

            auto it1=it;

            it++;

            s.erase(it1);
        }

        if(dist[i][0]<INF) s.insert({a[i].bot-1,-i});
        if(dist[i][1]<INF) s.insert({a[i].top+1,i});
    }

    ll ans=INF;

    for(pii it:s)
    {
        int id=abs(it.se),type=it.se>0;

        if(minimize(ans,dist[id][type]+abs(it.fi-T.y)+abs(a[id].left-T.x))) trace[n+1][0]=it;
    }

    cout<<ans<<'\n';

    vector<pii> tracing;

    #define PUSH(a,b) if(!tracing.empty()) {if(tracing.back().fi==0&&a==0) tracing.back().se+=b;else if(tracing.back().se==0&&b==0)tracing.back().fi+=a;else tracing.push_back({a,b});}else tracing.push_back({a,b});

    int u=n+1,id=0;

    while(u!=0)
    {
        int v=abs(trace[u][id].se);
        int type=trace[u][id].se>0;

        int delta_x=T.x-a[v].left-1,delta_y=T.y-trace[u][id].fi;

        PUSH(1,0);
        if(delta_y!=0) PUSH(0,delta_y);
        if(delta_x!=0) PUSH(delta_x,0);

        int newx=a[v].left,newy=type==0 ? a[v].bot-1 : a[v].top+1;

        T={newx,newy,0};

        u=v;
    }

    reverse(all(tracing));

    cout<<tracing.size()<<'\n';

    for(pii p:tracing) cout<<p.fi<<' '<<p.se<<'\n';
}

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

    nhap();
    solve();

    return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...