当前位置: 首页 > news >正文

BZOJ5286:[HNOI/AHOI2018]转盘——题解

https://www.lydsy.com/JudgeOnline/problem.php?id=5286

https://www.luogu.org/problemnew/show/P4425

https://loj.ac/problem/2495

题面见上面。

然后因为懒得写公式了所以看这个人的博客吧:https://www.luogu.org/blog/litble-blog/solution-p4425

合并的原理如果看了那个博客还没看懂的话,不妨看看下面这张图:

我们要求的是最上面区间的答案,但显然不能是tr[a]=min(tr[a<<1]],tr[a<<1|1]),因为中间的区间还需要合并。

因为参考博客已经证明了tr[a]表示的区间长度对答案没有影响了所以我们就考虑所有的区间即可。

我们的suan函数的a是最上边区间的左区间,mx和num就是当前区间的mx[a]。

显然当mx>=num的时候a的左区间答案只受mx的影响,而右区间的靠右位置有可能不受mx的影响,因此递归处理。

当mx<num的时候a的右区间只受num的影响,取一个最小值为mid+1+num,再递归处理左区间即可(因为左区间的mx可能比num大)。

#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=2e5+5;
inline int read(){
    int X=0,w=0;char ch=0;
    while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
    while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
    return w?-X:X;
}
int n,m,p,t[N],b[N],tr[N*4],mx[N*4];
int suan(int a,int l,int r,int num){
    if(l==r)return l+max(mx[a],num);
    int mid=(l+r)>>1;
    if(mx[a<<1|1]>=num)
    return min(tr[a],suan(a<<1|1,mid+1,r,num));
    else return min(suan(a<<1,l,mid,num),mid+1+num);
}
void upt(int a,int l,int r){
    mx[a]=max(mx[a<<1],mx[a<<1|1]);
    tr[a]=suan(a<<1,l,(l+r)>>1,mx[a<<1|1]);
}
void build(int a,int l,int r){
    if(l==r){
    tr[a]=t[l];mx[a]=b[l];
    return;
    }
    int mid=(l+r)>>1;
    build(a<<1,l,mid);build(a<<1|1,mid+1,r);
    upt(a,l,r);
}
void mdy(int a,int l,int r,int x){
    if(l==r){
    tr[a]=t[l];mx[a]=b[l];
    return;
    }
    int mid=(l+r)>>1;
    if(x<=mid)mdy(a<<1,l,mid,x);
    else mdy(a<<1|1,mid+1,r,x);
    upt(a,l,r);
}
int main(){
    n=read(),m=read(),p=read();
    for(int i=1;i<=n;i++){
    t[i]=t[i+n]=read();
    b[i]=t[i]-i;
    b[i+n]=t[i+n]-i-n;
    }
    build(1,1,n<<1);
    int lastans=tr[1]+n-1;printf("%d\n",lastans);
    for(int i=1;i<=m;i++){
    int x=read(),y=read();
    if(p)x^=lastans,y^=lastans;
    t[x]=t[x+n]=y;b[x]=y-x;b[x+n]=y-x-n;
    mdy(1,1,n<<1,x);mdy(1,1,n<<1,x+n);
    lastans=tr[1]+n-1;printf("%d\n",lastans);
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/9092806.html

相关文章:

  • maven 下载地址
  • JS中的深拷贝与浅拷贝了解一下
  • Postfix邮件系统
  • .NET CORE 2.0发布后没有 VIEWS视图页面文件
  • MSSQL最佳实践:如何监控备份还原进度?
  • 项目依赖和生成顺序造成的问题
  • MySQL修改root密码的方法
  • 多线程事务回滚
  • 5.30 Tree Traversal + Tree manipulation
  • 网页视频加速播放
  • 阿里云新一代关系型数据库 PolarDB 剖析
  • 函数模板(四十七)
  • Springboot 整合 dubbo 的一些坑
  • 10 个 Python 初学者必知编码小技巧
  • CentOS7下安装NVIDIA独立显卡驱动出现X service error问题解决方法
  • python3.6+scrapy+mysql 爬虫实战
  • “大数据应用场景”之隔壁老王(连载四)
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • canvas 高仿 Apple Watch 表盘
  • Git的一些常用操作
  • Js基础知识(四) - js运行原理与机制
  • laravel with 查询列表限制条数
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Spring Security中异常上抛机制及对于转型处理的一些感悟
  • text-decoration与color属性
  • Vim Clutch | 面向脚踏板编程……
  • 阿里云应用高可用服务公测发布
  • 动态魔术使用DBMS_SQL
  • 对象引论
  • 回流、重绘及其优化
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 突破自己的技术思维
  • 新版博客前端前瞻
  • 学习ES6 变量的解构赋值
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 中文输入法与React文本输入框的问题与解决方案
  • Play Store发现SimBad恶意软件,1.5亿Android用户成受害者 ...
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • (c语言)strcpy函数用法
  • (Matlab)基于蝙蝠算法实现电力系统经济调度
  • (笔试题)合法字符串
  • (算法二)滑动窗口
  • (一)插入排序
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET Core 项目指定SDK版本
  • .net core 依赖注入的基本用发
  • .net mvc 获取url中controller和action
  • .Net MVC4 上传大文件,并保存表单
  • .NET 解决重复提交问题
  • .net 微服务 服务保护 自动重试 Polly
  • .net操作Excel出错解决
  • .NET开源项目介绍及资源推荐:数据持久层 (微软MVP写作)