转自:http://www点2cto.com/kf/201209/153025.html 用链表居然比线段树快。。。。。 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define mp make_pair #define X first #define Y second #define MEMSET(a, b) memset(a, b, sizeof(a)) using namespace std; typedef unsigned int ui; typedef long long ll; typedef unsigned long long ull; typedef pair pii; typedef vector vi; typedef vi::iterator vi_it; typedef map mii; typedef priority_queue pqi; typedef priority_queue , greater > rpqi; typedef priority_queue pqp; typedef priority_queue , greater > rpqp; const int MAX_N = 50000 + 2; int seg[MAX_N][2]; int main(int argc, char *argv[]) { // freopen("D:\\in.txt", "r", stdin); int n, s, i; list coll; list ::iterator it; cin >> n >> s; coll.push_back(mp(0, s)); for (i = 0; i < n; ++i) scanf("%d%d", seg[i], seg[i] + 1); for (i = n - 1; i >= 0; --i) { int lcost = INT_MAX, rcost = INT_MAX; for (it = coll.begin(); it != coll.end();) { // pii tmp = *it; if (seg[i][0] <= it->Y && seg[i][1] >= it->Y) { lcost = min(lcost, it->X + it->Y - seg[i][0]); rcost = min(rcost, it->X + seg[i][1] - it->Y); it = coll.erase(it); } else { ++it; } } if (lcost != INT_MAX) { coll.push_back(mp(lcost, seg[i][0])); coll.push_back(mp(rcost, seg[i][1])); } } int ans = INT_MAX; for (it = coll.begin(); it != coll.end(); ++it) { ans = min(ans, it->X + abs(it->Y)); } cout << ans << endl; return 0; }