Codeforce 1420 C2. Pokémon Army (hard version) 解析(思維)

今天我們來看看CF1420C2

題目連結

題目

略,請直接看原題。

前言

根本想不到這個等價的想法

想法

首先注意到,如果數列其中一段是遞增數列,那麼我們最好的方式就是減去最小的那個數字並且加上最大的那個數字。因為這樣做得到的值是\(\max-\min\),而如果我們選取這遞增數列中間的兩個數字,就會使得值減小。

因此,我們發現,答案就是所有local maximum-local minimum。(local maximum代表某個\(a[i]\)使得\(a[i]>a[i-1]\)且\(a[i]>a[i+1]\),反之亦然。當然,第一個選和最後一個選的數字要是maximum)

而接下來我們會發現,如果我們只以local maximum-local minimum來計算值,實在不容易計算數字調換後的答案,因此我們需要一個新穎的想法。

\(ans=\sum\limits_{i=1}^{n}\max\{0,a[i]-a[i-1]\}\)(思考一下,這樣計算和我們上面說的方法是一樣的)

如此一來,每次調換\(a[l],a[r]\),只需要先把\(a[l],a[r]\)造成的影響減掉,並且把新的影響加上去即可。

注意:\(l+1=r\)時特別考慮,且我們要初始化\(a[0]=a[n+1]=0\)

程式碼:

const int _n=3e5+10;
int t,n,q,l,r,a[_n];
ll ans;
main(void) {cin.tie(0);ios_base::sync_with_stdio(0);
cin>>t;while(t--){
ans=0;
cin>>n>>q;rep(i,1,n+1)cin>>a[i]; a[0]=a[n+1]=0;
rep(i,1,n+1)ans+=max(0,a[i]-a[i-1]); cout<<ans<<'\n';
while(q--){
cin>>l>>r;
ans-=max(0,a[l]-a[l-1])+max(0,a[l+1]-a[l]),ans-=max(0,a[r]-a[r-1])+max(0,a[r+1]-a[r]);
if(l+1==r)ans+=max(0,a[l+1]-a[l]);
swap(a[l],a[r]);
ans+=max(0,a[l]-a[l-1])+max(0,a[l+1]-a[l]),ans+=max(0,a[r]-a[r-1])+max(0,a[r+1]-a[r]);
if(l+1==r)ans-=max(0,a[l+1]-a[l]);
cout<<ans<<'\n';
}
}
return 0;
}

標頭、模板請點Submission看

Submission

C2. Pokémon Army (hard version) 解析(思維)的更多相关文章

  1. C1. Pokémon Army (easy version) 解析(DP)

    Codeforce 1420 C1. Pokémon Army (easy version) 解析(DP) 今天我們來看看CF1420C1 題目連結 題目 對於一個數列\(a\),選若干個數字,求al ...

  2. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  3. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  4. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  5. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  6. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  7. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

  8. D. Road to Post Office 解析(思維)

    Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...

  9. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

随机推荐

  1. C++中_T()和L的区别

    转载:https://blog.csdn.net/amusi1994/article/details/53898960 前言 本文旨在介绍于VC++常见的两个类型:_T()和L   概念 字符串前面加 ...

  2. 达梦数据库_DM8配置实时主备

    1.环境说明 准备三台机器DM_HD1.DM_HD11.DM_SH,DM_HD1和DM_HD11用来部署主备库,DM_SH用来部署确认监视器.其中DM_HD1和DM_HD11配置两块网卡,一块接入内部 ...

  3. springCloud项目搭建

    新建父maven项目 groupId:pers.xzp.springCloudartifactId:springCloud 父项目中仅仅需要一个pom文件,用于管理模块的依赖统一.继承等 编辑pom文 ...

  4. minikube dashboard报503的错误

    minikube start之后,minikube dashboard启动web界面报503错误 解决方案,删除掉c盘用户目录下的.kube和.minikube目录,重新启动,具体什么原因导致的呢,也 ...

  5. Windows 系统蓝屏错误小全

    0 0x00000000 作业完成. 1 0x00000001 不正确的函数. 2 0x00000002 系统找不到指定的档案. 3 0x00000003 系统找不到指定的路径. 4 0x000000 ...

  6. Linux操作系统(第二版)(RHEL 8/CentOS 8)

    Linux操作系统(第二版)(RHEL 8/CentOS 8) http://www.tup.tsinghua.edu.cn/booksCenter/book_08172501.html Linux操 ...

  7. 多测师讲解接口测试 _接口测试思路_高级讲师肖sir

  8. 多测师讲解自动化--rf断言(下)--_高级讲师肖sir

    1.Page Should Contain 1.1存在页面上的内容 1.2 不存在页面上的内容, 运行抛异常 1.3 Page Should Not Contain 1.4 1.5 输入页面元素,判断 ...

  9. MeteoInfoLab脚本示例:subplot

    subplot命令可以自动等间距分配多个坐标系(Axes),命令中有三个参数,前两个定义了行数和列数,第三个指定了当前的坐标系(Axes),绘图命令是作用在当前坐标系中的. 脚本程序: def f(t ...

  10. .Net Core中使用Grpc

    一.Grpc概述 gRPC 基于如下思想:定义一个服务, 指定其可以被远程调用的方法及其参数和返回类型.gRPC 默认使用protocol buffers作为接口定义语言,来描述服务接口和有效载荷消息 ...