通过这题,我发现了我最大的缺陷,就是题目中重要的性质发现不了,所以导致后期根本做不了。还是要多做题,培养思维

对于这道题,来发现性质吧

对于每一条路线,因为它有用的就是最终的时刻,所以我们都可以把它变成一条由中间一个点出发,在起点等待一些时刻,然后接下来的每个时刻都向右走,在同一时刻完成任务

可以知道,每个路线都是可以这样转化的

所以我们要考虑的路线就只有在起点等待,然后不断向右走的路线

然后就有了这么一个式子(数组加长一倍,去掉环的影响)

\(ans=min_{1 \leq i \leq n}\{max_{0 \leq j \leq n-1} \{T_{i+j}-j\}+n-1\}\)

因为每种路线的瓶颈在于过每个点作 \(y=x+b\) 的线后(先要把点的时刻转化成二位平面内的点),最上方的那根线,所以取max找那根线,然后再取min,找所有路线的最优解

继续推,\(ans=min_{1\leq i \leq n}\{max_{i \leq j \leq i+n-1}\{T_j-j+i\}+n-1\}=min_{1\leq i \leq n}\{max_{i \leq j \leq i+n-1}\{T_j-j\}+i+n-1\}\)

因为max的范围让我们很不爽,不好一起维护,于是考虑把max的范围改一下,而又不影响答案

发现因为 \(T_j=T_{j+n}\) , 所以 \(T_j-j>T_{j+n}-j-n\),那么我们就算多考虑到复制的数组里去,由于我们找的是max,所以也不会影响答案

于是max的范围就变成了 \(2n\) , \(ans=min_{1\leq i \leq n}\{max_{i \leq j \leq 2n}\{T_j-j\}+i\}+n-1\)

然后就要对于每个 \(i\) ,既要维护这个东西, \(max_{i \leq j \leq 2n}\{T_j-j\}+i\),又要维护所有 \(i\) 的这个东西的min

那就用线段树

线段树对于每个区间维护两个东西,一个是整块区间的max,另一个是左半区间的答案(就是上面那个式子)

类似于楼房重建去修改和查询就可以了

#include<bits/stdc++.h>
#define ui unsigned int
#define ll long long
#define db double
#define ld long double
#define ull unsigned long long
const int MAXN=100000+10,inf=0x3f3f3f3f;
int n,m,p,ans;
template<typename T> inline void read(T &x)
{
T data=0,w=1;
char ch=0;
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')w=-1,ch=getchar();
while(ch>='0'&&ch<='9')data=((T)data<<3)+((T)data<<1)+(ch^'0'),ch=getchar();
x=data*w;
}
template<typename T> inline void write(T x,char ch='\0')
{
if(x<0)putchar('-'),x=-x;
if(x>9)write(x/10);
putchar(x%10+'0');
if(ch!='\0')putchar(ch);
}
template<typename T> inline void chkmin(T &x,T y){x=(y<x?y:x);}
template<typename T> inline void chkmax(T &x,T y){x=(y>x?y:x);}
template<typename T> inline T min(T x,T y){return x<y?x:y;}
template<typename T> inline T max(T x,T y){return x>y?x:y;}
#define Mid ((l+r)>>1)
#define ls rt<<1
#define rs rt<<1|1
#define lson ls,l,Mid
#define rson rs,Mid+1,r
struct Segment_Tree{
int Mx[MAXN<<3],Mn[MAXN<<3];
inline int Query(int rt,int l,int r,int lmtR,int arMx)
{
if(l==r)return min(l!=lmtR?l+1+arMx:inf,max(arMx,Mx[rt])+l);
else
{
if(arMx>=Mx[rs])return Query(lson,lmtR,arMx);
else return min(Mn[rt],Query(rson,lmtR,arMx));
}
}
inline void PushUp(int rt,int l,int r)
{
Mx[rt]=max(Mx[ls],Mx[rs]);
if(l<=n)Mn[rt]=Query(lson,Mid,Mx[rs]);
}
inline void Update(int rt,int l,int r,int pos,int k)
{
if(l==r)Mx[rt]=k;
else
{
if(pos<=Mid)Update(lson,pos,k);
else Update(rson,pos,k);
PushUp(rt,l,r);
}
}
};
Segment_Tree T;
#undef Mid
#undef ls
#undef rs
#undef lson
#undef rson
int main()
{
freopen("circle.in","r",stdin);
freopen("circle.out","w",stdout);
read(n);read(m);read(p);
for(register int i=1;i<=n;++i)
{
int x;read(x);
T.Update(1,1,n<<1,i,x-i);T.Update(1,1,n<<1,i+n,x-i-n);
}
write(ans=T.Mn[1]+n-1,'\n');
while(m--)
{
int x,y;read(x);read(y);
if(p)x^=ans,y^=ans;
T.Update(1,1,n<<1,x,y-x);T.Update(1,1,n<<1,x+n,y-x-n);
write(ans=T.Mn[1]+n-1,'\n');
}
return 0;
}

【比赛】HNOI2018 转盘的更多相关文章

  1. 【BZOJ5286】[HNOI2018]转盘(线段树)

    [BZOJ5286][HNOI2018]转盘(线段树) 题面 BZOJ 洛谷 题解 很妙的一道题目啊.(全世界除了我这题都有40分,就我是一个状压选手 首先来发现一些性质,我们走一圈一定不会更差. 为 ...

  2. 5286: [Hnoi2018]转盘

    5286: [Hnoi2018]转盘 链接 分析: $\min\limits_{i=1}^n \{ \max\limits_{j=i}^{i + n - 1} \{ a_{j}+i \} \} +n- ...

  3. [HNOI2018]转盘

    [HNOI2018]转盘 给你一个 \(n\) 元环, 你可以在 \(0\) 时刻从任意一个位置出发, 每一秒可以选择往后或者留在原地每个点有个参数 \(T_i\) , 当你走到 \(i\) 的时间 ...

  4. [BZOJ5286][洛谷P4425][HNOI2018]转盘(线段树)

    5286: [Hnoi2018]转盘 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 15  Solved: 11[Submit][Status][Di ...

  5. bzoj 5286: [Hnoi2018]转盘

    Description Solution 首先注意到一个点不会走两次,只会有停下来等待的情况,把序列倍长 那么如果枚举一个起点\(i\),答案就是 \(min(max(T[j]+n-(j-i)-1)) ...

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

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

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

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

  8. [HNOI2018]转盘[结论+线段树]

    题意 题目链接 分析 首先要发现一个结论:最优决策一定存在一种 先在出发点停留之后走一圈 的情况,可以考虑如下证明: 如果要停留的话一定在出发点停留,这样后面的位置更容易取到. 走超过两圈的情况都可以 ...

  9. 【题解】HNOI2018转盘

    何学长口中所说的‘一眼题’……然而实际上出出来我大HN全省也只有一个人A…… 首先我们需要发现一个性质:我们永远可以在最后一圈去标记所有的物品.倘若我们反复转圈,那么这完全是可以省下来的.所以我们破环 ...

随机推荐

  1. spark submit参数及调优(转载)

    spark submit参数介绍 你可以通过spark-submit --help或者spark-shell --help来查看这些参数. 使用格式:  ./bin/spark-submit \ -- ...

  2. 跨域发送HTTP请求详解

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述几种跨域发HTTP请求的几种方法,POST请求,GET请求 目录: 一,采用JsonP的方式(只能 ...

  3. 海思NB-IOT的SDK函数使用说明

    1. 查询当前AT指令是否正在处理中 while(get_at_cmd_in_progress() == false); 2. 信号量发送函数 (, osNoWait); 3. 信号量接收函数 if( ...

  4. Unity FSM 有限状态机

    翻译了一下unity wiki上对于有限状态机的案例,等有空时在详细写一下.在场景中添加两个游戏物体,一个为玩家并修改其Tag为Player,另一个为NPC为其添加NPCControl脚本,并为其将玩 ...

  5. Siki_Unity_3-16_3D数学基础

    Unity 3-16 3D数学基础 任务0-1:课程介绍 课程大纲: 1. 3D数学介绍 2. Unity中的几种坐标系: 全局坐标系.屏幕坐标系等 坐标系间的坐标转换:比如屏幕坐标转换到世界坐标 3 ...

  6. 【转】AOE机制的DSL及其实际运用

    AOE这个词的意思,我相信玩过WOW的人都不陌生,包括玩过LoL的也不会陌生,说穿了就是一个区域内发生效果(Area of effect).这里我们要讨论的就是关于一个适合于几乎所有游戏的AOE机制, ...

  7. spring-boot 项目整合logback

    使用spring-boot项目中添加日志输出,java的日志输出一共有两个大的方案log4j/log4j2 ,logback.log4j2算是对log4j的一个升级版本. 常规做法是引入slf4j作为 ...

  8. centos上搭建git服务--4

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...

  9. 检查Linux服务器性能的关键十条命令

    检查Linux服务器性能的关键十条命令 概述 通过执行以下命令,可以在1分钟内对系统资源使用情况有个大致的了解. uptime dmesg | tail vmstat 1 mpstat -P ALL ...

  10. Planning The Expedition(暴力枚举+map迭代器)

    Description Natasha is planning an expedition to Mars for nn people. One of the important tasks is t ...