Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
贴个代码,并提示一下可能错的一个地方:不能用cin#include <iostream> using namespace std; int dat[1 << 17];//线段树 int n_;//线段树最深一层的首元素下标 int init(const int & n);//将所有值初始化为足够大的数 void update(int s, int v);//将第 s 个数更新为 v int query(int & left, int & right, int k, int begin, int end);//返回 [left, right] 的最小值 inline int getvalue(int & s);//返回第 s 个数的值 int main() { int n, m, lb, rb, mina; cin >> n >> m; n_ = init(n); update(1, 0);//当只有 1 个数时只需要 0 个 Sorter for (int i = 0; i < m; i++) { //cin >> lb >> rb;//会导致超时 scanf_s("%d%d", &lb, &rb); mina = query(lb, rb, 0, 0, n_); if (mina + 1 < getvalue(rb)) { update(rb, mina + 1); } } cout << getvalue(n) << '\n'; return 0; } int init(const int & n) { int m = 1; while (m < n) { m <<= 1; } m = (2 * m) - 1;//此时 m 为树的节点个数 for (int i = 0; i < m; i++) { dat[i] = 1 << 30; } return m >> 1; } void update(int s, int v) { s += n_; dat[s] = v; do { s = (s - 1) >> 1; if (dat[s] > v) { dat[s] = v; } else { break; } } while (s); return; } int query(int & left, int & right, int k, int begin, int end) { if ((end >= left) && (begin <= right)) { if ((left <= begin) && (end <= right)) { return dat[k]; } else if (k < n_) { int mid = (begin + end) >> 1, lv, rv; lv = query(left, right, (k << 1) + 1, begin, mid); rv = query(left, right, (k << 1) + 2, mid + 1, end); if (lv < rv) { return lv; } else { return rv; } } } return 1 << 30; } inline int getvalue(int & s) { return dat[s + n_]; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator