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. Redis中的事务(多命令)操作

    作为一个nosql数据库,事务是必要功能.但是redis我们是可以理解为它不支持事务操作的,因为它的特征完全不满足我们对事物的正常理解 ps:我不知道是谁一开始提出redis支持事务的,但是我更倾向于 ...

  2. Redis5设计与源码分析读后感(二)简单动态字符串SDS

    一.引言 学习之前先了解几个概念: SDS定义:简单动态字符串,Redis的基本数据结构之一,用于储存字符串和整型数据. 二进制安全:C语言中用"\0"表示字符串结束,如果字符串本 ...

  3. kali上密码工具使用例如mudusa,hydra等

    思路 各种密码类别大致数学原理 https://blog.csdn.net/carol980206/article/details/96705859 https://www.jianshu.com/p ...

  4. 1、了解JVM

    1.JVM.JRE.JDK JVM:是可以将要运行的程序编译成机器语言并去执行的一个平台,具有跨语言.跨平台的特性,运行时需要依赖JRE中的类库 JRE:包含了JVM以及代码运行时的类库,时Java程 ...

  5. Spring学习(三)--Spring的IOC

    1.BeanFactory和FactoryBean BeanFactory是一个接口类,定义了IOC容器最基本的形式,提供了IOC容器所应该遵守的基本服务契约. FactoryBean是一个能产生或者 ...

  6. 【转载】C/走迷宫代码

    1 #include<iostream> 2 #include<windows.h> 3 #include"GotoXY.h" 4 #include < ...

  7. Java知识系统回顾整理01基础04操作符03逻辑运算符

    一.长路与 和 短路与 无论长路与还是短路与 两边的运算单元都是布尔值 都为真时,才为真 任意为假,就为假 区别 长路与 两侧,都会被运算 短路与 只要第一个是false,第二个就不进行运算了 pub ...

  8. JDBC Java 连接 MySQL 数据库

    MySQL 版本:Server version: 5.7.17-log MySQL Community Server (GPL) 用于测试的 MySQL 数据库:game 查看数据库中的表 mysql ...

  9. Docker入门手册

    20.Docker 20.1 Docker的起源 2010年,几个搞IT的年轻人,在美国旧金山成立了一家名叫"dotCloud"的公司,这家公司主要提供基于PaaS的云计算技术服务 ...

  10. 使用appium后安卓手机无法调出键盘解决方法

    问题:用appium进行真机调试后,使用手机的app进行输入时无法调出键盘. 原因:appium调试时,将手机输入法设置成了Unicode IME 解决方法: 方法一,手机设置里修改输入法: 不同的手 ...