题意:有n年,其中m年可以乘时光机回到过去,q个询问

下面m行,x,y 表示可以在y年穿越回x年, 保证y>x

下面q个询问, 每个询问有个年份k

问的是k年前面 有多少年可以通过一种以上($\ge 2$)方法穿越回去的, 其中时光机只能用一次

比如案例


如图

对于询问

6这一年:1.穿越回第1年

      2.等时间过呀过呀过到第9年,再穿越回第1年

那么第1年就有两种方法可以穿越回去, 同理, 2、3、4年也有同样两种方法(回到1再等时间过呀过 过到2、3、4)

所以对于6, 有一种以上方法回去的年有1、2、3、4、5总共五年, 输出5

一开始觉得可以用区间覆盖  覆盖小于两次的就为0, 大于等于2的用rmq找左端点

后来发现这样并不可行... ... 因为时光机只能用一次, 那么对于类似这种的  5这个点就无法处理啦

那么换一种想法

既然要一种以上穿越回去的办法(时间并不会倒流)那么就 要求 该时间点后面至少有两个时间点可以穿越回去 否则答案就为0

而穿越回去的  离自己最第二远的  就是自己能穿越回的超过一种方法的最远的地方

来看这个案例

  对于6这个时间,它能穿越回1、2、3、4, 从1可以等到2、3、4

因此第二小的时间点就是能回去的最远的时间点(超法1种方法)

那么问题就转化成了如何求区间第二大的问题

那这不就是主席树的功能了嘛!

好的,接下来只要把m个穿越的方法当作m个区间处理就好了

(这里有主席树的小白化解释)

 #include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PI;
#define lson l, m
#define rson m+1, r
const int N=;
int L[N<<], R[N<<], sum[N<<];
int tot;
int T[N], Hash[N];
int build(int l, int r)
{
int rt=(++tot);
sum[rt]=;
if(l<r)
{
int m=(l+r)>>;
L[rt]=build(lson);
R[rt]=build(rson);
}
return rt;
} int update(int pre, int l, int r, int x)
{
int rt=(++tot);
L[rt]=L[pre], R[rt]=R[pre], sum[rt]=sum[pre]+;
if(l<r)
{
int m=(l+r)>>;
if(x<=m)
L[rt]=update(L[pre], lson, x);
else
R[rt]=update(R[pre], rson, x);
}
return rt;
} int query(int u, int v, int l, int r, int k)
{
if(l>=r)
return l;
int m=(l+r)>>;
int num=sum[L[v]]-sum[L[u]];
if(num>=k)
return query(L[u], L[v], lson, k);
else
return query(R[u], R[v], rson, k-num);
} PI a[N]; int main()
{
int n, m, q;
while(~scanf("%d%d%d", &n, &m, &q))
{
tot=;
int mm=;
for(int i=; i<=m; i++)
{
int x, y;
scanf("%d%d", &x, &y);
if(x>y)
a[++mm]=make_pair(x, y);
}
m=mm;
sort(a+, a++m);
for(int i=;i<=m;i++)
Hash[i]=a[i].second;
sort(Hash+, Hash++m);
int d=unique(Hash+, Hash++m)-Hash-;
T[]=build(, d);
for(int i=; i<=m; i++)
{
int x=lower_bound(Hash+, Hash++d, a[i].second)-Hash;
T[i]=update(T[i-], , d, x);
}
while(q--)
{
int k;
scanf("%d", &k);
int p=lower_bound(a+, a++m, make_pair(k, ))-a;
if(m-p<)
{
puts("");
continue;
}
int x=query(T[p-], T[m], , d, );
int ans=k-Hash[x];
if(ans<=)
puts("");
else
printf("%d\n", ans);
}
}
return ;
}

ZOJ 3888

[主席树 强制在线]ZOJ3888 Twelves Monkeys的更多相关文章

  1. [BZOJ 3720][JZYZOJ 2016]gty的妹子树 强制在线 树分块/树套树

    jzyzoj的p2016 先码着,强制在线的树分块或者树套树?关键是我树分块还在入门阶段树套树完全不会啊摔   http://blog.csdn.net/jiangyuze831/article/de ...

  2. BZOJ4771 七彩树(dfs序+树上差分+主席树)

    考虑没有深度限制怎么做.显然的做法是直接转成dfs序上主席树,但如果拓展到二维变成矩形数颜色数肯定没法做到一个log. 另一种做法是利用树上差分.对于同种颜色的点,在每个点处+1,dfs序相邻点的lc ...

  3. SPOJ3267 D-query 离线+树状数组 在线主席树

    分析:这个题,离线的话就是水题,如果强制在线,其实和离线一个思路,然后硬上主席树就行了 离线的代码 #include <iostream> #include <stdio.h> ...

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

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

  5. 计蒜客 38229.Distance on the tree-1.树链剖分(边权)+可持久化线段树(区间小于等于k的数的个数)+离散化+离线处理 or 2.树上第k大(主席树)+二分+离散化+在线查询 (The Preliminary Contest for ICPC China Nanchang National Invitational 南昌邀请赛网络赛)

    Distance on the tree DSM(Data Structure Master) once learned about tree when he was preparing for NO ...

  6. luoguP5105 不强制在线的动态快速排序 [官方?]题解 线段树 / set

    不强制在线的动态快速排序 题解 算法一 按照题意模拟 维护一个数组,每次直接往数组后面依次添加\([l, r]\) 每次查询时,暴力地\(sort\)查询即可 复杂度\(O(10^9 * q)\),期 ...

  7. hdu 4605 Magic Ball Game (在线主席树/离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. hdu 4605 题意: 有一颗树,根节点为1,每一个节点要么有两个子节点,要么没有,每个节点都有一个权值wi .然后,有一个球,附带值x . 球 ...

  8. SPOJ DQUERY D-query (在线主席树/ 离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. SPOJ DQUERY 题意: 给出一串数,询问[L,R]区间中有多少个不同的数 . 解法: 关键是查询到某个右端点时,使其左边出现过的数都记录在 ...

  9. zoj 3888 Twelves Monkeys 二分+线段树维护次小值

    链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemCode=3888 Twelves Monkeys Time Limit: 5 ...

随机推荐

  1. python的异常处理try/except 万能处理exception

    1.try方式 try: age=int(input(">>>")) int(age)#主逻辑 num=input(">>>>& ...

  2. javascript 字符串的连接和截取

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. intellj(idea) 编译项目时在warnings 页签框里 报 “xxx包不存在” 或 “找不到符号” 或 “未结束的字符串字面值” 或 “需要)” 或 “需要;”等错误提示

    如上图: 环境 是 刚换的系统,重装的Intellj,直接双击老的皇帝项目中的idea的 .iml文件,结果 打开 intellj 后,进行 ctrl +shift +F9 编译时 尽然报 错误提示, ...

  4. 旋钮QDial

    样式: import sys from PyQt5.QtGui import QFont from PyQt5.QtWidgets import QApplication, QWidget, QDia ...

  5. 第5月第7天 php slim

    1. <?php require 'Slim/Slim.php'; require 'DBManagement.php'; \Slim\Slim::registerAutoloader(); $ ...

  6. transition,过渡效果

    语法: transtion:property time change-speed delay. 人话就是:属性(property )在多少秒内(time )通过什么样的速度(change-speed) ...

  7. tomcat顺序图摘要

    1.Connector 处理一次请求顺序图 2.Context 和 wrapper 的处理请求时序图 3. 参考: https://www.ibm.com/developerworks/cn/java ...

  8. 关于《汇编语言(王爽)》程序6.3使用16个dw 0的问题

    在学习王爽老师<汇编语言>的第6.2节时,在程序6.3代码中,给出了如下的代码: assume cs:code code segment dw 0123h, 0456h, 0789h, 0 ...

  9. 公共模块定义/草案(Common Module Definition / draft - CMD草案)

    This specification addresses how modules should be written in order to be interoperable in browser-b ...

  10. java 多线程面试

    一.多线程的创建 1.多线程的创建 (1).继承Thread类 (2).实现Runnable接口 2.两种启动线程方法的区别 1.共同点 必须调用Thread 产生线程,然后调用start()方法 开 ...