spoj K-th Number (classic! 区间静态第k大)
来源:互联网 发布:spring源码视频百度云 编辑:程序博客网 时间:2024/05/18 03:20
这道题的 comment 里有人说
题目链接
Beautiful problem. There exists solution which run in O(log^3 N), O(log^2 N), and O(log N) per query. Explore them and learn something new!
我学到的第一种应该是最大的那种, 就是构造一个线段树, 其中每个节点都是排序后的对应区间上的数。然后通过二分求第k大
这种只能处理静态。。
const int N = 100005;int n, m, ai[N];vector<int> tree[N*4], nodes;#define lc o<<1#define rc o<<1|1void build(int o, int l, int r) { if ( l == r ) { int x; scanf("%d", &x); tree[o].push_back(x); } else { int m = (l + r) >> 1; build(lc, l, m); build(rc, m + 1, r); tree[o].resize(r - l + 1); merge(tree[lc].begin(), tree[lc].end(), tree[rc].begin(), tree[rc].end(), tree[o].begin()); }}void query(int o, int l, int r, int ql, int qr) { if ( ql <= l && r <= qr ) { nodes.push_back(o); return; } int m = (l + r) >> 1; if ( ql <= m ) query(lc, l, m, ql, qr); if ( qr > m ) query(rc, m + 1, r, ql, qr);}int cnt(int key) { int ret = 0; for (int i = 0; i < nodes.size(); ++i) { const vector<int> &v = tree[nodes[i]]; ret += lower_bound(v.begin(), v.end(), key) - v.begin(); } return ret;}int main() {#ifdef _LOCA_ENV_ freopen("input.in", "r", stdin);#endif // _LOCA_ENV scanf("%d%d", &n, &m); build(1, 1, n); vector<int> vals = tree[1]; vals.resize( unique(vals.begin(), vals.end()) - vals.begin() ); rep(ri, 1, m) { int x, y, k; scanf("%d%d%d", &x, &y, &k); int l = 0, r = vals.size(), m; nodes.clear(); query(1, 1, n, x, y); // 这里的复杂度 // logn * logn * logn while ( l < r ) { m = (l + r) >> 1; int tmp = cnt(vals[m]); if ( tmp < k ) l = m + 1; else r = m; } printf("%d\n", vals[r-1]); } return 0;}
0 0
- spoj K-th Number (classic! 区间静态第k大)
- poj2140 K-th Number(静态区间第 k 大)
- spoj MKTHNUM - K-th Number(动态查询区间第k小)
- poj2104 K-th Number(静态区间k大,主席树)
- poj 2104 K-th Number 静态区间第K大 可持续数据结构
- POJ 2104 K-th Number 主席树 静态区间第K大
- POJ 2104 K-th Number (主席树 静态区间第K大)
- poj 2104 K-th Number (静态区间第k大,主席树)
- POJ 2104 K-th Number 静态区间第k大 主席树
- POJ 2104 K-th Number 静态第K大模板
- poj 2107 K-th Number(主席树求区间第K大)
- 用线段树求区间第K大(POJ 2104 K-th Number)
- hdu 2104 K-th Number(静态求区间第k小+整体二分)
- 静态区间第K大
- POJ 2104(K-th Number-区间第k大-主席树)
- POJ 2104(K-th Number-区间第k大-主席树)
- 【POJ 2104】(K-th Number-区间第k大-主席树)
- POJ2104-K-th Number-区间第k大-可持久化线段树/主席树
- 算法题:剔除字符串(很有意思)
- python爬虫 爬取淘女郎介绍以及照片
- APACHE2.X 禁止服务器IP直接访问
- 生活灵感汇总
- Azure WEBsite 的跨站点高可用(上海数据中心-北京数据中心)
- spoj K-th Number (classic! 区间静态第k大)
- HDU1950-Bridging signals-最长上升子序列
- LeetCode中的DataBase面试题
- spring webService调用过程service与mapper出现NullPointException
- Javascript Promises Are Awesome
- 【SRM664-2】【BearPlaysDiv2】
- iOS objc_msgSend 报错解决方案
- 【SRM664-2】【BearCheats】
- [CSQ]关于人工智能的浅谈