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

鸣谢hu1029282594上传

分析:


bzoj没有题面,自己手动整理题面好麻烦。。

题意就是: 有一个圈,找一个点作为起点,可以停顿或者往前走,每个点物品都有个出现时间,当我们到达这个点且物品存在就可以拿走他,问所有物品都被拿走需要的最少时间
 
可以根据神奇的推论:
选择一个点s,最优答案一定是停顿一会儿,之后不停歇的走完一圈。因为是圈,处理时,将Ti倍长。
 
那么答案就变成了

又因为Ti == Ti + n

所以

又由于里层循环是取max,所以答案可以变为

记录 Ai = Ti - i
 
那么答案变为了

此时只需要用线段树维护一下就好了,首先维护每段区间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]转盘(线段树)的更多相关文章

  1. BZOJ5286: [Hnoi2018]转盘 (线段树)

    题意 给你绕成一圈的物品共 \(n\) 个 , 然后从其中一个开始选 , 每次有两种操作 , 一是继续选择当前物品 , 二是选择这个后一个物品 . 选择后一个物品要求当前的时刻大于后一个的 \(T_i ...

  2. BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)

    BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...

  3. 【BZOJ】1012: [JSOI2008]最大数maxnumber /【洛谷】1198(线段树)

    Description 现在请求你维护一个数列,要求提供以下两种操作:1. 查询操作.语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值.限制:L不超过当前数列的长度.2. 插 ...

  4. 洛谷题解P4314CPU监控--线段树

    题目链接 https://www.luogu.org/problemnew/show/P4314 https://www.lydsy.com/JudgeOnline/problem.php?id=30 ...

  5. 洛谷P3372/poj3468(线段树lazy_tag)(询问区间和,支持区间修改)

    洛谷P3372 //线段树 询问区间和,支持区间修改 #include <cstdio> using namespace std; struct treetype { int l,r; l ...

  6. 洛谷P4065 [JXOI2017]颜色(线段树)

    题意 题目链接 Sol 线段树板子题都做不出来,真是越来越菜了.. 根据题目描述,一个合法区间等价于在区间内的颜色没有在区间外出现过. 所以我们可以对于每个右端点,统计最长的左端点在哪里,刚开始以为这 ...

  7. 洛谷P5111 zhtobu3232的线段树

    题意:给定线段树,上面若干个节点坏了,求能表示出多少区间. 区间能被表示出当且仅当拆出来的log个节点都是好的. 解:每个区间在最浅的节点处计算答案. 对于每个节点维护从左边过来能有多少区间,从右边过 ...

  8. 洛谷P3960 列队 NOIp2017 线段树/树状数组/splay

    正解:动态开点线段树 解题报告: 传送门! 因为最近学主席树的时候顺便get到了动态开点线段树?刚好想起来很久很久以前就想做结果一直麻油做的这题,,,所以就做下好了QAQ 然后说下,这题有很多种方法, ...

  9. 题解——洛谷P2781 传教(线段树)

    可以说是数据结构学傻了的典型案例了 昨天跳到这题上 然后思考了一下 噫!好!线段树裸题 然后打完板子,发现\(  n \le 10^9 \) 显然线段树直接做不太行 然后这题又只有普及的难度 然后我就 ...

随机推荐

  1. GoF23种设计模式之结构型模式之享元模式

    一.概述  运用共享技术有效地支持大量细粒度的对象. 二.适用性 1.当一个应用程序使用了大量的对象的时候. 2.由于使用大量的独享而造成很大的存储开销的时候. 3.对象的大多数状态都可变为外部状态的 ...

  2. shutil,zipfile,tarfile模块

    一,shutil模块 1.shutil.chown() shutil.chown('test.txt',user='mysql',group='mysql') #改变文件的属主和属组. 2.shuti ...

  3. pandas-Notes1

    #coding = utf-8 import pandas as pd import numpy as np import matplotlib as plt # series, like vecto ...

  4. &与&&有什么区别?

    一.简要说明 按位与:a&b是把a和b都转换成二进制数然后再进行与的运算: 逻辑与:a&&b就是当且仅当两个操作数均为 true时,其结果才为 true:只要有一个为零,a&a ...

  5. UVa 1407 树形背包 Caves

    这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 #include <iostream> #include <cstdio> #inclu ...

  6. Vue简单了解

    目录 1. 前端概览 2. 现代前端开发方式 3. MVVM开发核心 4. Vue核心 5. Vue优点 6. Vue难点 7. Vue与非Vue项目结合 8. Vue调试 9. Vue与SEO 今天 ...

  7. Sogou日志分析(hive)

    1. 数据准备 1.1 数据预先放在mac本地桌面的“VB共享文件夹”中,从VisualBox虚拟机中/mnt/VBShare共享目录中转移到resources目标目录. [cloudera@quic ...

  8. pip安装 Tensorflow 安装包

    最简单的 Tensorflow 的安装方法是在 pip 一键式安装官方预编译好的包 pip install tensorflow通常这种预编译的包的编译参数选择是为了最大兼容性而不是为了最优性能,导致 ...

  9. BZOJ 4555 [Tjoi2016&Heoi2016]求和 ——分治 NTT 多项式求逆

    不想多说了,看网上的题解吧,我大概说下思路. 首先考察Stirling的意义,然后求出递推式,变成卷积的形式. 然后发现贡献是一定的,我们可以分治+NTT. 也可以直接求逆(我不会啊啊啊啊啊) #in ...

  10. SJTU Summer Camp

    Day -2,-1 提前坐飞机来到了上海,在旁边的酒店住下来,晚上去了外滩,在黄浦江边吹着晚风,依旧感慨万千,在衡中高三的一年竟然已经过去,经常出现在噩梦中的高考也已成为历史,然而命运可能并未就此改变 ...