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. PHP代码审计学习(1)

    全局变量与超全局变量 $GLOBALS $GLOBALS 是PHP的一个超级全局变量组,在一个PHP脚本的全部作用域中都可以访问,$GLOBALS 是一个包含了全部变量的全局组合数组.变量的名字就是数 ...

  2. SSTI服务器模板注入(以及关于渲染,solt的学习)&&[BJDCTF2020]The mystery of ip 1

    ssti服务器模板注入 ssti:利用公共 Web 框架的服务器端模板作为攻击媒介的攻击方式,该攻击利用了嵌入模板的用户输入方式的弱点.SSTI 攻击可以用来找出 Web 应用程序的内容结构. slo ...

  3. 关于JAVA的垃圾回收机制

    使用JAVA编程时,几乎不需要考虑"内存泄漏"的问题,这也是JAVA相较于C++的一个优点. 最近在看<Java编程思想>(第四版,听说第五版有点牛逼....),里面讲 ...

  4. C++练习案例1.计算机类(利用多态实现)

    c++简单计算机类 简介 大家好,这里是天天like的博客,这是我发的第一篇随笔,用来记录我的学习日程,大家可以相互学习,多多交流,感谢 今天我要记录的随笔是在学习c++多态的知识点练习改进的一个案例 ...

  5. Spring 集成 RabbitMQ

    pom.xml <dependency> <groupId>org.springframework.amqp</groupId> <artifactId> ...

  6. 探讨JVM运行机制和执行流程

    JVM是什么 概述 JVM是Java Virtual Machine的缩写.它是一种基于计算设备的规范,是一台虚拟机,即虚构的计算机. JVM屏蔽了具体操作系统平台的信息(显然,就像是我们在电脑上开了 ...

  7. Python练习题 035:Project Euler 007:第10001个素数

    本题来自 Project Euler 第7题:https://projecteuler.net/problem=7 # Project Euler: Problem 7: 10001st prime ...

  8. 基于springboot工程浅谈整合rabbitmq怎么样防止消息发送mq不丢失和消费mq的消息防止丢失

    本文只针对springboot整合rabbitmq的消息防丢失,话不多说,上干货.... 设置发送mq消息不丢失实现思路 执行的方案: 第一步,要对队列,消息以及交换机进行持久化操作(保存到物理磁盘中 ...

  9. Arduino PID Library

    Arduino PID Library by Brett Beauregard,contact: br3ttb@gmail.com What Is PID?   PID是什么 From  Wikipe ...

  10. osu合集(期望dp)

    T1 EASY 我们设\(f_i\)表示到\(i\)的连续个数平方的期望. \(g_i\)表示到到\(i\)的连续个数的期望 在维护\(f_i\)的同时维护一下\(g_i\)就行了. 转移方程: \( ...