[BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)
5286: [Hnoi2018]转盘
Time Limit: 20 Sec Memory Limit: 512 MB
Submit: 15 Solved: 11
[Submit][Status][Discuss]
Description
一次小G和小H准备去聚餐,但是由于太麻烦了于是题面简化如下:
一个转盘上有摆成一圈的n 个物品(编号1~n ),其中的i 个物品会在T_i时刻出现。
在0时刻时,小G可以任选n 个物品中的一个,我们将其编号为s_0 。并且如果i时刻选择了物品s_i ,那么i+1 时刻可以继续选择当前物品或选择下一个物品。当s_i为n 时,下一个物品为物品1 ,否则为物品s_i+1 。
在每一时刻(包括0时刻),如果小G选择的物品已经出现了,那么小G将会标记它。小H想知道,在物品选择的最优策略下,小G什么时候能标记所有物品?
但麻烦的是,物品的出现时间会不时修改。我们将其描述为m 次修改,每次修改将改变其中一个物品的出现时间。每次修改后,你也需求出当前局面的答案。对于其中部分测试点,小H还追加了强制在线的要求。
Input
第一行三个非负整数n 、m 、p ,代表一共有n 个物品,m 次修改。p 只有0或1两种取值,强制在线时p 为1,否则p 为0.
接下来一行,有n 个非负整数,第i个数T_i代表物品i的出现时间。
接下来m行,每行两个非负整数x 、y ,代表一次修改及询问。修改方式如下:
(1)如果p=0 ,则表示物品x 的出现时间T_x 修改为y 。
(2)如果p=1 ,在先将x 和y 分别异或LastAns,得到x'和y′,然后将物品x' 的出现时间T_x' 修改为y′ 。其中的LastAns 是前一个询问的结果;特别的,第一次修改时LastAns为初始局面的答案。
保证输入合法。
Output
第一行一个整数,代表初始局面的答案。
接下来m 行每行一个整数,分别代表每次修改后的答案。
Sample Input
Sample Output
HINT

Source

又因为Ti == Ti + n
所以
又由于里层循环是取max,所以答案可以变为


此时只需要用线段树维护一下就好了,首先维护每段区间Ai的最大值,
然后在push时,对于i ∈[l,mid],找到最小的 i + Aj 并储存下来,这个O(logn)递归可以做到。
总复杂度O(nlogn^2 + mlogn^2)
AC代码:
# include <iostream>
# include <cstdio>
# include <cstring>
using namespace std;
const int N = 2e5 + ;
int T[N],A[N],n,m,k;
struct Seg{
int mx[N << ],mi[N << ];
int Query(int l,int r,int rt,int bac)
{
if(l == r)return l + max(mx[rt],bac);
int mid = l + r >> ;
if(mx[rt << | ] < bac)
return min(Query(l,mid,rt << ,bac),mid + + bac);
return min(mi[rt],Query(mid + ,r,rt << | ,bac));
}
void push(int l,int r,int rt)
{
mi[rt] = Query(l,l + r >> ,rt << ,mx[rt << | ]);
mx[rt] = max(mx[rt << ],mx[rt << | ]);
}
void build(int l,int r,int rt)
{
if(l == r){mx[rt] = A[l];mi[rt] = T[l];return;}
int mid = l + r >> ;
build(l,mid,rt << );
build(mid + ,r,rt << | );
push(l,r,rt);
}
void updata(int L,int l,int r,int rt)
{
if(l == r){mx[rt] = A[l];mi[rt] = T[l];return;}
int mid = l + r >> ;
if(L <= mid)updata(L,l,mid,rt << );
else updata(L,mid + ,r,rt << | );
push(l,r,rt);
}
}B;
int main()
{
scanf("%d %d %d",&n,&m,&k);
for(int i = ;i <= n;i++)
{
scanf("%d",&T[i]);T[i + n] = T[i];
A[i] = T[i] - i;A[i + n] = A[i] - n;
}
B.build(,n << ,);
int las,x,y;printf("%d\n",las = B.mi[] + n - );
while(m--)
{
scanf("%d %d",&x,&y);x ^= k * las,y ^= k * las;
T[x] = T[x + n] = y;A[x] = T[x] - x;A[x + n] = A[x] - n;
B.updata(x,,n << ,);B.updata(x + n,,n << ,);
printf("%d\n",las = B.mi[] + n - );
}
}
[BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)的更多相关文章
- BZOJ5286: [Hnoi2018]转盘 (线段树)
题意 给你绕成一圈的物品共 \(n\) 个 , 然后从其中一个开始选 , 每次有两种操作 , 一是继续选择当前物品 , 二是选择这个后一个物品 . 选择后一个物品要求当前的时刻大于后一个的 \(T_i ...
- BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)
BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)
Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...
- 洛谷题解P4314CPU监控--线段树
题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...
- 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)
洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...
- 洛谷P4065 [JXOI2017]颜色(线段树)
题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...
- 洛谷P5111 zhtobu3232的线段树
题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...
- 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay
正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...
- 题解——洛谷P2781 传教(线段树)
可以说是数据结构学傻了的典型案例了 昨天跳到这题上 然后思考了一下 噫!好!线段树裸题 然后打完板子,发现\( n \le 10^9 \) 显然线段树直接做不太行 然后这题又只有普及的难度 然后我就 ...
随机推荐
- Decorator——Python初级函数装饰器
最近想整一整数据分析,在看一本关于数据分析的书中提到了(1)if __name__ == '__main__' (2)列表解析式 (3)装饰器. 先简单描述一下前两点,再详细解说Python初级的函数 ...
- 嵌入式入门学习笔记3:[转]编译linux
摘自:https://blog.csdn.net/baidu_24256693/article/details/80115354 编译Linux是什么意思? Linux内核是Linux操作系统的核心, ...
- hiho 1050 树的直径
#1050 : 树中的最长路 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到,小Ho得到了一棵二叉树玩具,这个玩具是由小球和木棍连接起来的,而在拆拼它的过程中, ...
- Nordic Collegiate Programming Contest 2015 G. Goblin Garden Guards
In an unprecedented turn of events, goblins recently launched an invasion against the Nedewsian city ...
- PAT Basic 1076
1076 Wifi密码 下面是微博上流传的一张照片:“各位亲爱的同学们,鉴于大家有时需要使用 wifi,又怕耽误亲们的学习,现将 wifi 密码设置为下列数学题答案:A-1:B-2:C-3:D-4:请 ...
- 在spring boot中使用webSocket组件(一)
最近在项目中使用到了spring的webSocket组件,在这里和大家分享下,如有错误,欢迎大家指正. 在这里我使用的IDE工具是Intellij idea,框架是spring boot.spring ...
- 针对NM_CUSTOMDRAW消息的学习
消息的形式:1 窗口消息,2 命令消息,3 WM_NOTIFY消息,4 自定义消息 我们的NM_CUSTOMDRAW消息就是就属于第三种WM_NOTIFY消息,而添加消息映射的方法分为两种: BEGI ...
- luogu1169 [ZJOI2007]棋盘制作
悬线法 #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...
- C/C++、Java、Python谁是编译型语言,谁是解释型语言?
最近各大互联网公司线上笔试,编程题目里的编译器只支持C/C++.Java,甚至有的支持javaScrpit和Pascal,就是不支持Python.让一直以来用惯了Python的我直吐血,于是今天痛定思 ...
- 【bzoj4800】[Ceoi2015]Ice Hockey World Championship 折半搜索
题目描述 有n个物品,m块钱,给定每个物品的价格,求买物品的方案数. 输入 第一行两个数n,m代表物品数量及钱数 第二行n个数,代表每个物品的价格 n<=40,m<=10^18 输出 一行 ...