假设序列$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. 解决VSCODE"因为在此系统上禁止运行脚本"报错

    在VSCODE中使用yarn,结果报错: 找了下原因,是因为PowerShell执行策略的问题. 解决方法:   以管理员身份运行vscode;  执行:get-ExecutionPolicy,显示R ...

  2. ReentrantLock可重入锁、公平锁非公平锁区别与实现原理

    ReentrantLock是lock接口的一个实现类,里面实现了可重入锁和公平锁非公平锁 ReentrantLock公平锁和不公平锁实现原理 公平锁会获取锁时会判断阻塞队列里是否有线程再等待,若有获取 ...

  3. Android系统编程入门系列之应用权限的定义与申请

    在之前关于应用内数据本地保存为文件时,曾提到应用需要申请外部存储设备的读写权限才能访问外部存储中的文件.那么针对某一种权限,应用程序具体应该怎么申请使用呢?本文将详细介绍. 应用中的权限主要分为两类, ...

  4. Go语言核心36讲(Go语言进阶技术七)--学习笔记

    13 | 结构体及其方法的使用法门 我们都知道,结构体类型表示的是实实在在的数据结构.一个结构体类型可以包含若干个字段,每个字段通常都需要有确切的名字和类型. 前导内容:结构体类型基础知识 当然了,结 ...

  5. Git: 搭建一个本地私人仓库

    Git: 搭建一个本地私人仓库 寝室放个电脑.实验室也有个电脑 为进行数据同步,充分利用实验室的服务器搭建了个本地私人仓库 1. 安装流程 当然首先保证服务器上与PC机上都已经安装了可用的Git 在P ...

  6. HTTP请求如何带参

    这两天正好作一份API的接口文档,关于HTTP request如何传递参数不是很清楚,这里转载了他人的文档,让我明白了很多.. http://tomfish88.iteye.com/category/ ...

  7. Alpha Scrum Meeting汇总

    第一次Alpha Scrum Meeting 第二次Alpha Scrum Meeting 第三次Alpha Scrum Meeting 第四次Alpha Scrum Meeting 第五次Alpha ...

  8. BUAA2020软工作业(四)——结对项目

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力,团队协作能力 这个作业在哪 ...

  9. springBoot服务整合线程池ThreadPoolTaskExecutor与@Async详解使用

    ThreadPoolExecutor:=======这个是java自己实现的线程池执行类,基本上创建线程池都是通过这个类进行的创建.ThreadPoolTaskExecutor:========这个是 ...

  10. springcloud整合seata

    springcloud整合seata 一.背景 二.项目结构 三.实现功能: 四.项目使用到的技术 五.整合步骤 1.引入spring-cloud-starter-alibaba-seata jar包 ...