整体二分模板题, 有些细节需要注意

#include<cstdio>
#include<cctype>
#include<climits>
#include<algorithm>
#include<cstring>
using namespace std;
inline int read()
{
int x = 0, flag = 1;
char c;
while(! isgraph(c = getchar()))
if(c == '-')
flag *= - 1;
while(isgraph(c))
x = x * 10 + c - '0', c = getchar();
return x * flag;
}
void println(int x)
{
if(x < 0)
putchar('-'), x *= - 1;
if(x == 0)
putchar('0');
int ans[10 + (1 << 4)], top = 0;
while(x)
ans[top ++] = x % 10, x /= 10;
for(; top; top --)
putchar(ans[top - 1] + '0');
putchar('\n');
}
const int MAXN = (int)1e5 + (1 << 5), MAXM = (int)5e4 + (1 << 4);
const int oo = INT_MAX;
int a[MAXN];
struct query
{
int L, R, k, ID;
query(){}
query(int L, int R, int k, int ID): L(L), R(R), k(k), ID(ID){}
}Q[MAXN];
int res[MAXN], sum[MAXN];
int nxt[MAXN][2], pre[MAXN][2];
int _a[MAXN], map[MAXN];
query _Q[MAXM];
int ans[MAXM];
void solve(int mn, int mx, int L, int R, int QL, int QR)
{
if(mn >= mx)
{
for(int i = QL; i <=QR; i ++)
ans[Q[i].ID] = mn;
return;
}
int cur = (mn + mx) >> 1;
for(int i = L; i <= R; i ++)
res[i] = (a[i] <= cur);
sum[L] = res[L];
for(int i = L + 1; i <= R; i ++)
sum[i] = sum[i - 1] + res[i];
pre[L][res[L]] = L, pre[L][res[L] ^ 1] = - oo;
for(int i = L + 1; i <= R; i ++)
pre[i][res[i]] = i, pre[i][res[i] ^ 1] = pre[i - 1][res[i] ^ 1];
nxt[R][res[R]] = R, nxt[R][res[R] ^ 1] = oo;
for(int i = R - 1; i >= L; i --)
nxt[i][res[i]] = i, nxt[i][res[i] ^ 1] = nxt[i + 1][res[i] ^ 1];
int Ltop = L, Rtop = R;
for(int i = L; i <= R; i ++)
{
if(res[i])
_a[Rtop] = a[i], map[i] = Rtop --;
else
_a[Ltop] = a[i], map[i] = Ltop ++;
}
int mid = Rtop;
for(int i = L; i <= R; i ++)
a[i] = _a[i];
Ltop = QL, Rtop = QR;
for(int i = QL; i <= QR; i ++)
{
int cnt = sum[Q[i].R] - sum[Q[i].L - 1];
if(cnt < Q[i].k)
{
Q[i].L = map[nxt[Q[i].L][0]];
Q[i].R = map[pre[Q[i].R][0]];
Q[i].k -= cnt; //当 cnt < k 时要在k中减去cnt
if(Q[i].L > Q[i].R)
swap(Q[i].L, Q[i].R); //记得要判断是否需要调换顺序
_Q[Ltop ++] = Q[i];
}
else if (cnt >= Q[i].k) //当 cnt >= k时则不需要减去cnt
{
Q[i].L = map[nxt[Q[i].L][1]];
Q[i].R = map[pre[Q[i].R][1]];
if(Q[i].L > Q[i].R)
swap(Q[i].L, Q[i].R);
_Q[Rtop --] = Q[i];
}
}
for(int i = QL; i <= QR; i ++)
Q[i] = _Q[i];
for(int i = L; i <= R; i ++)
sum[i] = 0;
solve(cur + 1, mx, L, mid, QL, Rtop);
solve(mn, cur, mid + 1, R, Ltop, QR);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("POJ2104.in", "r", stdin);
freopen("POJ2104.out", "w", stdout);
#endif
int n = read();
int m = read();
int mx = - oo, mn = oo;
for(int i = 1; i <= n; i ++)
a[i] = read(), mx = max(mx, a[i]), mn = min(mn, a[i]);
for(int i = 1; i <= m; i ++)
{
int L = read(), R = read(), k = read();
Q[i] = query(L, R, k, i);
}
memset(sum, 0, sizeof(sum));
solve(mn, mx, 1, n, 1, m);
for(int i = 1; i <= m; i ++)
println(ans[i]);
}

POJ2104Kth Number的更多相关文章

  1. 平方分割poj2104K-th Number

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 59798   Accepted: 20879 Ca ...

  2. POJ-2104-K-th Number(区间第K大+主席树模板题)

    Description You are working for Macrohard company in data structures department. After failing your ...

  3. POJ2104-- K-th Number(主席树静态区间第k大)

    [转载]一篇还算可以的文章,关于可持久化线段树http://finaltheory.info/?p=249 无修改的区间第K大 我们先考虑简化的问题:我们要询问整个区间内的第K大.这样我们对值域建线段 ...

  4. 【静态主席树】POJ2104-K-th Number

    求区间第k大.裸线段树. 莫队版本:☆ #include<iostream> #include<cstdio> #include<cstring> #include ...

  5. 【序列莫队+二分答案+树状数组】POJ2104-K-th Number

    [题目大意] 给出一个长度为n的序列和m组查询(i,j,k),输出[i,j]中的第k大数. [思路] 先离散化然后莫队分块.用树状数组来维护当前每个值的个数,然后对于每次询问二分答案即可. 又一次实力 ...

  6. POJ-2104-Kth Number(主席树)

    链接: https://vjudge.net/problem/POJ-2104#author=malic 题意: 给定一个数组 a[1...n],数组元素各不相同,你的程序要对每次查询Q(i,j,k) ...

  7. JavaScript Math和Number对象

    目录 1. Math 对象:数学对象,提供对数据的数学计算.如:获取绝对值.向上取整等.无构造函数,无法被初始化,只提供静态属性和方法. 2. Number 对象 :Js中提供数字的对象.包含整数.浮 ...

  8. Harmonic Number(调和级数+欧拉常数)

    题意:求f(n)=1/1+1/2+1/3+1/4-1/n   (1 ≤ n ≤ 108).,精确到10-8    (原题在文末) 知识点:      调和级数(即f(n))至今没有一个完全正确的公式, ...

  9. Java 特定规则排序-LeetCode 179 Largest Number

    Given a list of non negative integers, arrange them such that they form the largest number. For exam ...

随机推荐

  1. Python9-hashilib模块-day28(大年初三)

    __getitem__\__setitem__\__delitem__ class Foo: def __init__(self,name,age,sex): self.name = name sel ...

  2. javaweb通过接口来实现多个文件压缩和下载(包括单文件下载,多文件批量下载)

    原博客地址:https://blog.csdn.net/weixin_37766296/article/details/80044000 将多个文件压缩并下载下来:(绿色为修改原博客的位置) 注意:需 ...

  3. LA 7072 Signal Interference 计算几何 圆与多边形的交

    题意: 给出一个\(n\)个点的简单多边形,和两个点\(A, B\)还有一个常数\(k(0.2 \leq k < 0.8)\). 点\(P\)满足\(\left | PB \right | \l ...

  4. HDU 3394 双连通分量 桥 Railway

    第一个答案是统计图中桥的个数 如果一个点-双连通分量中边的个数大于点的个数那么这个块中所有的边都是冲突的,累加到第二个答案中去. #include <iostream> #include ...

  5. SpringDataJpa错误

    在运行项目的时候出现的错误如下: would dispatch back to the current handler URL [/save] again. Check your ViewResolv ...

  6. Redis 使用多个数据库及密码配置

    redis的默认端口是6379,可以使用的数据库最多有16个,不同数据库之间是独立的, 可以通过 select num 的方式访问不同的数据库 可以通过下面的命令来切换到不同的数据库下,每个数据库都有 ...

  7. spring AOP详解〇

    AOP正在成为软件开发的下一个圣杯.使用AOP,你可以将处理aspect的代码注入主程序,通常主程序的主要目的并不在于处理这些aspect.AOP可以防止代码混乱. 为了理解AOP如何做到这点,考虑一 ...

  8. c/c++内存泄露的检测方法

    此文内容摘自 https://zhuanlan.zhihu.com/p/22664202 作为   从零开始的 JSON 库教程(三):解析字符串解答篇  的笔记 1A. Windows 下的内存泄漏 ...

  9. Spring_mvc的搭建以及实现

    Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面.Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring ...

  10. 多元线性回归(pandas/scikit-learn)

    import pandas as pd from sklearn.cross_validation import train_test_split from sklearn.linear_model ...