\(\color{#0066ff}{题解}\)

#include<bits/stdc++.h>
#define LL long long
LL in() {
char ch; LL x = 0, f = 1;
while(!isdigit(ch = getchar()))(ch == '-') && (f = -f);
for(x = ch ^ 48; isdigit(ch = getchar()); x = (x << 1) + (x << 3) + (ch ^ 48));
return x * f;
}
const int maxn = 2e5 + 10;
const int inf = 0x7fffffff;
struct Tree {
protected:
struct node {
node *ch[2];
int l, r, min, tag;
node(int l = 0, int r = 0, int min = 0, int tag = inf): l(l), r(r), min(min), tag(tag) {}
void upd() { min = std::min(ch[0]->min, ch[1]->min); }
void trn(int val) { tag = std::min(tag, val), min = std::min(min, val); }
void dwn() {
if(tag == inf) return;
ch[0]->trn(tag), ch[1]->trn(tag);
tag = inf;
}
int mid() { return (l + r) >> 1; }
}*root;
void build(node *&o, int l, int r, int *a) {
o = new node(l, r, 0);
if(l == r) return(void)(o->min = a[l]);
int mid = (l + r) >> 1;
build(o->ch[0], l, mid, a);
build(o->ch[1], mid + 1, r, a);
o->upd();
}
void lazy(node *o, int l, int r, int val) {
if(l <= o->l && o->r <= r) return (void)(o->trn(val));
o->dwn();
if(l <= o->mid()) lazy(o->ch[0], l, r, val);
if(r > o->mid()) lazy(o->ch[1], l, r, val);
o->upd();
}
int query(node *o, int pos) {
if(o->l == o->r) return o->min;
o->dwn();
if(pos <= o->mid()) return query(o->ch[0], pos);
else return query(o->ch[1], pos);
}
public:
void build(int l, int r, int *a) { build(root, l, r, a); }
void lazy(int l, int r, int val) { lazy(root, l, r, val); }
int query(int pos) { return query(root, pos); }
}s;
int n, m, q, k;
int nxt[maxn][25];
int pre[maxn], ans[maxn];
struct node {
int l, r, id;
node(int l = 0, int r = 0): l(l), r(r) {}
friend bool operator < (const node &a, const node &b) { return a.l < b.l; }
}e[maxn];
int a[maxn], ls[maxn];
bool vis[maxn];
int id(int x) { return x + 10; }
bool judge(int l, int r) {
for(int i = l; i <= r; i++) if(vis[i] || i > n) return false;
return true;
}
void predoit() {
int now = 1;
for(int i = 1; i <= m; i++) {
vis[a[i]] = true;
while(now <= n && !judge(now, now + k - 1)) now++;
ls[i] = now;
}
s.build(1, m, ls);
#ifdef olinr
for(int i = 1; i <= m; i++) printf("%d%c", ls[i], i == m? '\n' : ' ');
#endif
for(int i = 1; i <= n; i++) pre[i] = m + 1;
for(int i = m; i >= 1; i--) {
for(int j = -k + 1; j <= k - 1; j++) {
if(a[i] + j >= 1 && a[i] + j <= n)
nxt[i][id(j)] = pre[a[i] + j];
}
pre[a[i]] = i;
} #ifdef olinr
for(int i = 1; i <= m; i++)
for(int j = -k + 1; j <= k - 1; j++)
if(a[i] + j >= 1 && a[i] + j <= n) printf("after %d, near %d is %d\n", i, a[i] + j, nxt[i][id(j)]);
#endif
}
void work() {
std::sort(e + 1, e + q + 1);
int now = 1;
while(now <= q && e[now].l == 1) ans[e[now].id] = s.query(e[now].r), now++;
for(int i = 1; i <= m; i++) {
for(int j = -k + 1; j <= 0; j++) {
if(a[i] + j < 1 || a[i] + j + k - 1 > n) continue;
int min = m + 1;
for(int v = 0; v < k; v++) min = std::min(min, nxt[i][id(j + v)]);
s.lazy(i, min - 1, a[i] + j);
}
while(now <= q && e[now].l <= i + 1) ans[e[now].id] = s.query(e[now].r), now++;
}
} int main() {
freopen("stall.in", "r", stdin);
freopen("stall.out", "w", stdout);
n = in(), m = in(), q = in(), k = in();
for(int i = 1; i <= m; i++) a[i] = in();
for(int i = 1; i <= q; i++) e[i].l = in(), e[i].r = in(), e[i].id = i;
predoit();
work();
for(int i = 1; i <= q; i++) printf("%d\n", ans[i] == n + 1? -1 : ans[i]);
return 0;
} /*
10 5 15 2
3 1 6 7 5
1 1
1 2
1 3
1 4
1 5
2 2
2 3
2 4
2 5
3 3
3 4
3 5
4 4
4 5
5 5
*/

2019.2.25考试T3, 离线+线段树的更多相关文章

  1. hdu 4288 离线线段树+间隔求和

    Coder Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  2. bzoj2333 离线 + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2333 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来 ...

  3. HDU 5700 区间交 离线线段树

    区间交 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5700 Description 小A有一个含有n个非负整数的数列与m个区间.每个区间可以表示为 ...

  4. BZOJ 3626 [LNOI2014]LCA 树剖+(离线+线段树 // 在线+主席树)

    BZOJ 4012 [HNOI2015]开店 的弱化版,离线了,而且没有边权(长度). 两种做法 1 树剖+离线+线段树 这道题求的是一个点zzz与[l,r][l,r][l,r]内所有点的lcalca ...

  5. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  6. HDU 4031 Attack(离线+线段树)(The 36th ACM/ICPC Asia Regional Chengdu Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Problem Description Today is the 10th Annual of ...

  7. Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线+线段树

    题目链接: http://codeforces.com/contest/703/problem/D D. Mishka and Interesting sum time limit per test ...

  8. 【BZOJ 2333 】[SCOI2011]棘手的操作(离线+线段树)

    2333: [SCOI2011]棘手的操作 Description 有N个节点,标号从1到N,这N个节点一开始相互不连通.第i个节点的初始权值为a[i],接下来有如下一些操作: U x y: 加一条边 ...

  9. HDU 4605 Magic Ball Game (在线主席树|| 离线 线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题意:给出一棵二叉树,每个结点孩子数目为0或者2. ...

随机推荐

  1. python第二十三天-----Tornado

    Tornado是一个轻量级完整的web框架,在Linux系统下它会使用epoll,是一个异步非阻塞的web服务器框架,对于实时应用来说很理想,想想同是异步非阻塞的nginx的残暴程度就知道了 1.路由 ...

  2. java反射专题一

    一丶Class的理解 /* * Class类是反射的源头 * 创建一个类,通过编译(javac.exe),生成对应的.class文件,之后使用java.exe加载(JVM的类加载器完成的)此.clas ...

  3. python request (1) 环境

    环境准备 requests   httpbin  virtualenv  pip  python 安装 #mkdir /home/requests #yum install -y python-pip ...

  4. DAY16-Django之MTV

    MTV模型 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻辑,并在适当的时候 ...

  5. C# 设置程序session过期时间

    服务器设置: 如果服务器上点击站点没有ASP这一项: 下方 角色服务 添加角色服务 安装完毕重新打开iis 点击站点 就可以看到ASP这个选项了 程序webconfig配置: <system.w ...

  6. JavaScript的编译原理

    尽管通常将 JavaScript 归类为“动态”或“解释执行”语言,但事实上它是一门编译语言.这个事实对你来说可能显而易见,也可能你闻所未闻,取决于你接触过多少编程语言,具有多少经验.但与传统的编译语 ...

  7. Windows 安装 Microsoft Visual Studio 2010

    Windows 安装 VS2010 我的电脑系统:Windows 10 x64位 我要安装的Microsoft Visual Studio 是:VS2010 注意: VS2010 没有专门的64位版. ...

  8. RTX这种东西究竟有什么价值?

    我在第一家公司工作的时候,同事沟通用的就是RTX,第一感觉就是这么简单的软件也能卖钱? 这种东西有啥价值啊?不就是个没广告蓝色UI的qq吗? 还是那句话,当你已经习惯了一个东西之后,你不会感觉到他的价 ...

  9. 9.Delegate类

    Concepts      不像MVC模式,Model/View模式并没有单独用来处理事件和用户交互的组件(controller).通常,视图负责向用户呈现模型中的数据,并处理用户的输入.有时,为了让 ...

  10. php 函数追踪扩展 phptrace

    php 函数追踪扩展 phptrace 介绍 phptrace 是一个低开销的用于跟踪.分析 php 运行情况的工具. 它可以跟踪 php 在运行时的函数调用.请求信息.执行流程.并且提供有过滤器.统 ...