| ||||||||||
| 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