假设序列$b_{i}$为最终第$i$片上的草莓数,即需要满足:$\forall 0\le i<2n,a_{i}\le \sum_{j=0}^{n-1}b_{(i+j)mod\ 2n}$

要求最小化$\sum_{i=0}^{2n-1}b_{i}$,显然增大$b_{i}$一定仍满足条件,即具备单调性,二分并判断其是否可以为$X$

为了避免取模,将条件分为$0\le i<n$以及$n\le i<2n$两部分,分别可以写作:

1.$\forall 0\le i<n,a_{i}\le \sum_{j=0}^{n-1}b_{i+j}$

2.$\forall n\le i<2n,a_{i}\le \sum_{j=i}^{2n-1}b_{j}+\sum_{j=0}^{i-n-1}b_{j}$,考虑后者中不被计算的是一个连续区间,可以用$X$减去这一段,即$X-\sum_{j=i-n-1}^{i-1}b_{j}$,移项后即$\sum_{j=i-n}^{i-1}b_{j}\le X-a_{i}$

两部分分别限制了上下限,即条件也可以写作:$\forall 0\le i<n,a_{i}\le \sum_{j=0}^{n-1}b_{i+j}\le X-a_{i+n}$

对其求前缀和,令$S_{i}=\sum_{j=0}^{i-1}b_{j}$,即要求$a_{i}\le S_{i+n}-S_{i}\le X-a_{i+n}$

另一方面,根据$b_{i}\ge 0$,还要求$S_{i}\le S_{i+1}$(特别的,要求$S_{0}=0$以及$S_{2n-1}\le X$)

同时,上面这两个条件也是充分条件,问题即判断是否存在满足上述条件的$S_{i}$

将之变形,最终所有条件都可以写作$S_{i}+x\le S_{j}$,即差分约束的形式

更具体的来说,建有向边$(i,j,x)$并从0开始求最长路,令$d_{i}$为到$i$的最长路,即满足此条件

另外,有正环或最终$d_{2n-1}>X$即无解(这里最长路才是$S_{2n-1}$的最小值)

由于有正权边(求最长路),只能使用spfa,以及最外层的二分,复杂度为$o(n^{2}\log A)$,且会被卡

事实上,由于这张图的特殊性,有如下做法:

如果将$(n-1,n,0)$这条边删去,将整张图看作上下两行,分别为$[0,n)$和$[n,2n)$,图的结构即比较简单,仅包含上下两行对应点之的有环,以及两行向后的边

此时将两个对应点的最长路一起算,即没有了后效性,可以$o(n)$求出

(特别的,若$a_{i}+a_{i+n}>X$即存在两个对应点之间的正环,即无解)

加入这条边后,在没有正环的情况下,先忽略这条边求出最长路,再加入这条边后用$S_{n-1}$更新$S_{n}$并重复一次求最长路(仍然忽略这条边),若$S_{n-1}$发生变化必然存在正环,否则即求出了最长路

(另外更新$S_{n}$后,还需要判断是否满足$S_{n}\le X-a_{n}$)

这一做法复杂度$o(n\log A)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define ll long long
5 int E,n,a[N];
6 ll d[N];
7 void calc(ll k){
8 for(int i=1;i<n;i++){
9 d[i]=max(d[i-1],d[i+n-1]+a[i+n]-k);
10 d[i+n]=max(d[i+n-1],d[i-1]+a[i]);
11 }
12 }
13 bool check(ll k){
14 for(int i=0;i<n;i++)
15 if (a[i]+a[i+n]>k)return 0;
16 d[n]=a[0];
17 calc(k);
18 ll lst=d[n-1];
19 d[n]=max(d[n],d[n-1]);
20 if (d[n]>k-a[n])return 0;
21 calc(k);
22 if (lst!=d[n-1])return 0;
23 return d[2*n-1]<=k;
24 }
25 int main(){
26 scanf("%d",&n);
27 for(int i=0;i<2*n;i++)scanf("%d",&a[i]);
28 ll l=0,r=1e15;
29 while (l<r){
30 ll mid=(l+r>>1);
31 if (check(mid))r=mid;
32 else l=mid+1;
33 }
34 printf("%lld",l);
35 }

[ARC117F]Gateau的更多相关文章

  1. p_b_p_b 杂题选讲

    [ARC119F] AtCoder Express 3 [ARC117F] Gateau 考虑二分答案,对前缀和建差分约束 \(\text{check}\) ,但是用 \(\text{spfa}\) ...

  2. Compiler Theory(编译原理)、词法/语法/AST/中间代码优化在Webshell检测上的应用

    catalog . 引论 . 构建一个编译器的相关科学 . 程序设计语言基础 . 一个简单的语法制导翻译器 . 简单表达式的翻译器(源代码示例) . 词法分析 . 生成中间代码 . 词法分析器的实现 ...

随机推荐

  1. React Native之新架构中的Turbo Module实现原理分析

    有段时间没更新博客了,之前计划由浅到深.从应用到原理,更新一些RN的相关博客.之前陆续的更新了6篇RN应用的相关博客(传送门),后边因时间问题没有继续更新.主要是平时空余时间都用来帮着带娃了,不过还是 ...

  2. 题解 [HAOI2017]方案数

    题目传送门 Solution 我们没有障碍的时候很好做,直接设 \(f_{i,j,k}\) 表示到 \((x,y,z)\) \(x\) 有 \(i\) 位为 \(1\),\(y\) 有 \(j\) 位 ...

  3. 基于TLS证书手动部署kubernetes集群

      一.简介 Kubernetes是Google在2014年6月开源的一个容器集群管理系统,使用Go语言开发,Kubernetes也叫K8S. K8S是Google内部一个叫Borg的容器集群管理系统 ...

  4. ShutdownHook原理

    微信搜索"捉虫大师",点赞.关注是对我最大的鼓励 ShutdownHook介绍 在java程序中,很容易在进程结束时添加一个钩子,即ShutdownHook.通常在程序启动时加入以 ...

  5. Java继承、重写与重载

    1.java继承 1.1概念 继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为. 继承可以使用extends和implem ...

  6. Sequence Model-week1编程题3-用LSTM网络生成爵士乐

    Improvise a Jazz Solo with an LSTM Network 实现使用LSTM生成音乐的模型,你可以在结束时听你自己的音乐,接下来你将会学习到: 使用LSTM生成音乐 使用深度 ...

  7. MacOS安装使用Kettle

    一.环境说明 操作系统版本:macOS Big Sur 11.6.1 机型:Intel版本 JDK版本:Amazon Corretto-openjdk8 Kettle版本:Kettle8.9 二.问题 ...

  8. 移动端 h5 uniapp 读,写,删本地文件或sd文件

    移动端 h5 uniapp 读,写,删本地文件或sd文件 应用场景: 当我们需要做离线应用或者是加载本地文件时使用到此方法.(本篇文章给大家分享访问app私有文件目录,系统公共目录,sd外置存储的文件 ...

  9. the Agiles Scrum Meeting 3

    会议时间:2020.4.11 21:30 1.每个人的工作 今天已完成的工作 yjy:基本实现广播功能的前端 issues:小组任务1-增量开发组 wjx:基本实现注销功能的后端 issues:小组任 ...

  10. [Beta]the Agiles Scrum Meeting 3

    会议时间:2020.5.14 20:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 yjy 实现前端界面美化 tq 实现查看.删除测试点功能的前端修复功能中的bug wjx 升级系统实现 ...