1772. Ski-Trails for Robots (STL SET)

题意:滑雪,有n条滑道,滑道中有障碍。可以换滑道。问最少更换多少次滑道可以到达终点。

用set水过。stl是个好东西。

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <deque>
#include <string>

#define LL long long
#define DB double
#define SI(a) scanf("%d",&a)
#define SD(a) scanf("%lf",&a)
#define SS(a) scanf("%s",a)
#define SF scanf
#define PF printf
#define MM(a,v) memset(a,v,sizeof(a))
#define REP(i,a,b) for(int (i)=(a);(i)<(b);(i)++)
#define REPD(i,a,b) for(int (i)=(a);(i)>(b);(i)--)
#define N 100009
#define INF 0x3f3f3f3f3f3f3f3fll
#define EPS 1e-8
#define bug puts("bug")
using namespace std;
struct nod{
    int x;LL y;
    nod(int a=0,LL b=0){x=a;y=b;}
    bool operator<(const nod t) const
    {
        return x<t.x;
    }
};
set<nod> st;
int n,m,s;
void get(int k)
{
    set<nod>::iterator it;
    LL ans=INF;
    it = st.lower_bound(k);
    if(it!=st.end())
    {
        ans = min(ans,abs(k-it->x)+it->y);
    }
    if(it!=st.begin())
    {
        it--;
        ans = min(ans,abs(k-it->x)+it->y);
    }
    st.erase(k);
    st.insert(nod(k,ans));
}
void del(int a,int b)
{
    set<nod>::iterator it,en;
    it = st.lower_bound(a);
    en = st.upper_bound(b);
    while(it!=en)
    {
        st.erase(it);
        it = st.lower_bound(a);
        en = st.upper_bound(b);
    }
}
void out()
{
    set<nod>::iterator it,en;
    it = st.begin();
    en = st.end();
    LL ans = INF;
    while(it!=en)
    {
        ans = min(ans,it->y);
        it++;
    }cout<<ans<<endl;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("in.txt","r",stdin);
    #endif
    SI(n);SI(s);SI(m);
    st.insert(nod(s,0));
    int a,b;
    while(m--)
    {
        SI(a);SI(b);
        if(a>1) get(a-1);
        if(b<n) get(b+1);
        del(a,b);
    }
    out();
    return 0;
}


你可能感兴趣的:(数据结构,STL)