Codeforces 题面传送门 & 洛谷题面传送门

nb tea!!!111

首先很显然的一件事是对于三个数 \(a,b,c\),其最大值与最小值的差就是三个数之间两两绝对值的较大值,即 \(\max(|a-b|,|b-c|,|c-a|)\),因此我们不妨从差分序列的角度解决这个问题。对于原序列 \(h\),我们假设其差分序列 \(d_i=h_{i+1}-h_i\),那么 \(\max(h_i,h_{i+1},h_{i+2})-\min(h_i,h_{i+1},h_{i+2})=\max(|h_{i+1}-h_{i}|,|h_{i+2}-h_{i+1}|,|h_{i+2}-h_i|)\),又 \(h_{i+2}-h_i=d_i+d_{i+1}\),因此我们可以得到 \(w_i=\max(|d_i|,|d_{i+1}|,|d_i+d_{i+1}|)\)

思考到这里我们就能够想出一个非常 naive 的 DP,\(dp_{i,x}\) 表示考虑到前 \(i\) 个数,\(|d_i|=x\) 是否可行,转移就枚举下一个数 \(d_{i+1}=y\),那么 \(dp_{i,x}\) 能转移到 \(dp_{i+1,y}\) 的充要条件是 \(x=w_i\lor y=w_i\lor x+y=w_i\) 且 \(x,y\le w_i\),这样暴力 DP 是 \(\mathcal O(nC^2)\) 的,不知道能拿多少分(大雾)。考虑进行一点点优化,注意到我们 \(dp_{i,x}=1\) 的 \(x\) 肯定是成段分布的对吧,因此我们考虑每一段在转移前后会变成什么,我们假设考虑到 \(i\) 时,满足 \(dp_{i,x}=1\) 的 \(x\) 组成的集合为 \(S\),那么:

  • 如果 \(w_i\in S\),那么 \(\forall y\in[0,w_i]\) 均有 \(dp_{i+1,y}=1\),具体方案就是令 \(d_i=w_i,d_{i+1}=-y\)。
  • 如果到现在还没有判定出无解,也即 \(\exists x\in S,s.t.x<w_i\)(因为 \(>w_i\) 肯定不合法,并且由于该情况不同于上一种情况所以 \(w_i\notin S\)),那么有 \(dp_{i+1,w_i-x}=1\),具体方案就是 \(d_i=x,d_{i+1}=w_i-x\),同时也有 \(dp_{i+1,w_i}=1\),具体方案就是 \(d_i=-x,d_{i+1}=w_i\)。也就是说如果 \(w_i\notin S\),那么所有点都会变为 \(w_i-x\),同时加入一个新点 \(w_i\)

因此如果我们维护这些连续段组成的集合,那么每次可以暴力 \(\mathcal O(n)\) 转移每个连续段,因此我们复杂度就降到了 \(\mathcal O(n^2)\)(虽然还是一脸过不去的亚子)

考虑进一步优化,我们注意到这个过程很特别,因为每次如果 \(w_i\notin S\),那么新增进来的肯定是一个个单点,而区间自始至终都只有一个,也就是说我们可以不考虑一一反转这个单点,而是翻转整个数轴,也就是说我们开一个 set 维护这些单点在最一开始的数轴上的位置,然后维护两个值 \(L,R\) 表示当前区间的两个端点在最一开始的数轴上的位置,然后每次检验现在坐标为 \(w_i\) 的位置在最一开始的数轴上的位置是否属于这个集合与区间的并,如果属于则说明 \(x\in S\),那么我们就把数轴还原成一开始的样子,把 set 清空并把区间最右端点设为 \(0\) 和 \(w_i\),否则我们就记录一下区间是否被翻转,即 \(+x\) 方向是否已经变为 \(-x\),记这个标记为 \(flg\),以及数轴的偏移量 \(dlt\),那么我们就设 \(flg:=1-flg,dlt:=w_i-dlt\),然后把 \(w_i\) 加入集合。如果某一步 \(L\) 在现在数轴上对应的位置 \(>R\) 在现在数轴上对应的位置且 \(S=\varnothing\) 那么无解。

接下来考虑怎样找出合法的方案,我们不妨首先找出任意一个 \(c_i\in S\),其中 \(S\) 表示扫描到第 \(i\) 步时合法的 \(x\) 组成的集合,那么我们考虑这样构造出 \(|d_i|\),从最后一个元素开始,我们令 \(|d_{n+1}|=c_{n+1}\),然后如果 \(|d_{n+1}|=w_n\) 那么我们直接令 \(|d_n|=c_n\) 就好了,否则如果 \(c_n=w_n\) 说明 \(|d_n|\) 设为 \(w_n\) 是合法的选择,我们干脆就令 \(|d_n|=w_n\),否则我们就只能令 \(|d_{n}|=w_n-|d_{n+1}|\)。然后我们可以根据 \(|d_n|\) 构造出 \(d_n\),具体方案就是从右往左扫一遍,如果 \(|d_i|+|d_{i+1}|\ne w_i\) 就将 \(d_i\) 变为其相反数。

时间复杂度 \(n\log n\)。

const int MAXN=1e6;
int n;ll C,w[MAXN+5],can[MAXN+5],d[MAXN+5],s[MAXN+5],l,r;
set<ll> st;int flg;ll dlt;
ll gettrs(ll x){return flg?(dlt-x):(dlt+x);}
ll getori(ll x){return flg?(dlt-x):(x-dlt);}
int main(){
scanf("%d%lld",&n,&C);l=0;r=C;
for(int i=1;i<=n-2;i++) scanf("%lld",&w[i]);
for(int i=1;i<=n-2;i++){
ll L=getori(0),R=getori(w[i]);if(L>R) L^=R^=L^=R;
chkmax(l,L);chkmin(r,R);
while(!st.empty()&&(*st.begin())<L) st.erase(st.begin());
while(!st.empty()&&(*st.rbegin())>R) st.erase(st.find(*st.rbegin()));
if(l>r&&st.empty()) return puts("NO"),0;
if(st.find(getori(w[i]))!=st.end()||(l<=getori(w[i])&&getori(w[i])<=r)){
st.clear();l=0;r=can[i]=w[i];flg=dlt=0;continue;
} if(l<=r) can[i]=gettrs(l);else can[i]=gettrs(*st.begin());
flg^=1;dlt=w[i]-dlt;st.insert(getori(w[i]));
} if(l<=r) d[n-1]=gettrs(l);else d[n-1]=gettrs(*st.begin());
for(int i=n-2;i;i--){
if(can[i]==w[i]) d[i]=w[i];
else if(d[i+1]==w[i]) d[i]=can[i];
else d[i]=w[i]-d[i+1];
} ll t=1;
// for(int i=1;i<=n-1;i++) printf("%lld%c",d[i]," \n"[i==n-1]);
for(int i=n-2;i;i--){
if(abs(d[i])+abs(d[i+1])!=w[i]) t=-t;
d[i]=t*d[i];
} ll mn=1e18;puts("YES");
for(int i=1;i<=n;i++) s[i]=s[i-1]+d[i-1],chkmin(mn,s[i]);
for(int i=1;i<=n;i++) printf("%lld%c",s[i]-mn," \n"[i==n]);
return 0;
}

Codeforces 1500F - Cupboards Jumps(set)的更多相关文章

  1. Codeforces I. Producing Snow(优先队列)

    题目描述: C. Producing Snow time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. Codeforces Gym101341K:Competitions(DP)

    http://codeforces.com/gym/101341/problem/K 题意:给出n个区间,每个区间有一个l, r, w,代表区间左端点右端点和区间的权值,现在可以选取一些区间,要求选择 ...

  3. 【CodeForces - 651C 】Watchmen(map)

    Watchmen 直接上中文 Descriptions: 钟表匠们的好基友马医生和蛋蛋现在要执行拯救表匠们的任务.在平面内一共有n个表匠,第i个表匠的位置为(xi, yi). 他们需要安排一个任务计划 ...

  4. [Codeforces 274E]:Mirror Room(模拟)

    题目传送门 题目描述 有一个$n\times m$的格子图,其中有一些是黑色的,另一些为白色.从某个白色格子的中心点向左上($NW$),左下($SW$),右上($NE$),右下($SE$)四个方向中的 ...

  5. CodeForces - 1162E Thanos Nim (博弈论)

    Alice and Bob are playing a game with nn piles of stones. It is guaranteed that nn is an even number ...

  6. Codeforces Round #627 (Div. 3) C - Frog Jumps(逻辑)

    题意: 有一个每个单元标明移动方向的长为n的序列,每次移动不能超过距离k,问能够从0移动到n+1的k的最小值. 思路: k=最长连续L序列长度+1. #include <bits/stdc++. ...

  7. CodeForces 540C Ice Cave (BFS)

    http://codeforces.com/problemset/problem/540/C       Ice Cave Time Limit:2000MS     Memory Limit:262 ...

  8. codeforces 711C Coloring Trees(DP)

    题目链接:http://codeforces.com/problemset/problem/711/C O(n^4)的复杂度,以为会超时的 思路:dp[i][j][k]表示第i棵数用颜色k涂完后bea ...

  9. codeforces#1154F. Shovels Shop (dp)

    题目链接: http://codeforces.com/contest/1154/problem/F 题意: 有$n$个物品,$m$条优惠 每个优惠的格式是,买$x_i$个物品,最便宜的$y_i$个物 ...

随机推荐

  1. ScatterLayout分散布局在kv中的引用

    from kivy.uix.scatterlayout import ScatterLayout from kivy.app import App class ScatterLayoutWidget( ...

  2. [对对子队]会议记录4.21(Scrum Meeting12)

    今天已完成的工作 吴昭邦 ​ 工作内容:基本实现改变顺序合成 ​ 相关issue:实现流水线合成系统的逻辑 ​ 相关签入:4.21签入1 梁河览 ​ 工作内容:修改设置界面bug ​ 相关签入:4.2 ...

  3. 零基础学习Linux所必备的七大习惯

    对于很多Linux初学者来说,在刚开始使用linux系统时会感到很多的不适.这里为大家整理了自己以前linux入门时别人告诉我的七个习惯.我相信如果你运用了这七个习惯,在你使用Linux时你会感觉更安 ...

  4. MiniFly四轴飞行器之部分系统及电源分析

    最近硬件四轴很火,了解了很久,还是选择了MiniFly,主要还是资料多,后边可以有人讨论,不像很多就是建了个群,研究问题还是在论坛方便很多. 四轴终于拿到手,功能很强大,主要是还支持二次开发,可以研究 ...

  5. 用python检查矩阵的计算

    鉴于最近复习线性代数计算量较大,且1800答案常常忽略一些逆阵.行列式的计算答案,故用Python写出矩阵的简单计算程序,便于检查出错的步骤. 1.行列式 可自行更改阶数 from numpy imp ...

  6. 加法运算替代 牛客网 程序员面试金典 C++ Python

    加法运算替代 牛客网 程序员面试金典 题目描述 请编写一个方法,实现整数的乘法.减法和除法运算(这里的除指整除).只允许使用加号. 给定两个正整数int a,int b,同时给定一个int type代 ...

  7. 最后的OI(HAOI2020游记)

    马上就省选了,怎么不得写点什么?要不然到最后或许就真的落得个白茫茫大地真干净的局面. 其实也不知道该说啥?我这一路走来,感觉挺赚的. 每一个OIer背后都有一个故事,所以,我有故事,你有酒吗? 依稀记 ...

  8. 安装配置多个版本JDK

    前言:JDK有多个版本,有时为了开发需要切换不同的版本,在一部电脑上安装多个JDK,只需要按以下配置,每次即可轻松使用.以下环境为Windows10 安装JDK 安装JDK8 配置环境变量 需要配置J ...

  9. Trap (陷入/中断) 源码解析

    用户空间和内核空间之间的切换通常称为trap trap的三种形式 系统调用引发 异常发生 设备中断 (时间中断.IO中断.网络中断等) supervise mode的权限 用户态和内核态之间的到底有什 ...

  10. linux系列之: 你知道查看文件空间的两种方法吗?

    目录 简介 du命令 df命令 总结 简介 linux系统中查看文件空间大小应该是一个非常常见的命令了,今天给大家介绍linux系统中查看文件空间的两种方法和在使用中可能会遇到的奇怪问题. 为什么会有 ...