题意:给你一个序列,让你任意选出一个子序列,使得奇数位和减去偶数位和最大。同时有q个询问,输出每次交换完a[l]和a[r]后的上述最大值。

思路:首先肯定可以确定选出来的子序列长度为奇数,因为偶数位只会让我们的值减少。

我们先从简单的情况开始入手,当一个序列极大值只有一个时(只有一个波峰):



那我肯定只选那个波峰(极大值)就好了,只选一个。

当这个序列有多个波峰时:



首先我还是会选一个波峰,a[\(x{_1}\)]。但是发现光只选这个好像很亏。我们肯定想尽量拿多点波峰,但是我们下次选择是偶数位,是负贡献,所以想让它尽量小,所以在知道后面还有波峰的情况下,我们就再选一个a[\(x{_2}\)],然后再选a[\(x{_3}\)]。这个时候就比只选a[\(x{_1}\)]更赚了。同理,我们后面还会继续选a[\(x{_4}\)]、a[\(x{_5}\)]、a[\(x{_6}\)]、a[\(x{_7}\)]。注意最后一个a[n]大可不必选了,因为后面再没有波峰,选了白减去一个数。

所以问题就变成了求波峰波谷的问题,我们只需要将每一次的波峰之和减去波谷之和即是答案(除去边界两点)。

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<map>
#include <queue>
#include<sstream>
#include <stack>
#include <set>
#include <bitset>
#include<vector>
#define FAST ios::sync_with_stdio(false)
#define abs(a) ((a)>=0?(a):-(a))
#define sz(x) ((int)(x).size())
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define rep(i,a,n) for(int i=a;i<=n;++i)
#define per(i,n,a) for(int i=n;i>=a;--i)
#define endl '\n'
#define pb push_back
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<ll,ll> PII;
const int maxn = 3e5+200;
const int inf=0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1.0);
const int mod = 1e9+7;
inline int lowbit(int x){return x&(-x);}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
void ex_gcd(ll a,ll b,ll &d,ll &x,ll &y){if(!b){d=a,x=1,y=0;}else{ex_gcd(b,a%b,d,y,x);y-=x*(a/b);}}//x=(x%(b/d)+(b/d))%(b/d);
inline ll qpow(ll a,ll b,ll MOD=mod){ll res=1;a%=MOD;while(b>0){if(b&1)res=res*a%MOD;a=a*a%MOD;b>>=1;}return res;}
inline ll inv(ll x,ll p){return qpow(x,p-2,p);}
inline ll Jos(ll n,ll k,ll s=1){ll res=0;rep(i,1,n+1) res=(res+k)%i;return (res+s)%n;}
inline ll read(){ ll f = 1; ll x = 0;char ch = getchar();while(ch>'9'||ch<'0') {if(ch=='-') f=-1; ch = getchar();}while(ch>='0'&&ch<='9') x = (x<<3) + (x<<1) + ch - '0', ch = getchar();return x*f; }
int dir[3] = { -1, 0, 1 }; ll a[maxn];
ll ans = 0;
ll n,q; void check(int pos)
{
if(pos>n||pos<1) return;
if(a[pos]>a[pos-1]&&a[pos]>a[pos+1]) ans += a[pos];
if(a[pos]<a[pos-1]&&a[pos]<a[pos+1]) ans -= a[pos];
} void Delete(int pos)
{
if(pos>n||pos<1) return;
if(a[pos]>a[pos-1]&&a[pos]>a[pos+1]) ans -= a[pos];
if(a[pos]<a[pos-1]&&a[pos]<a[pos+1]) ans += a[pos];
} int main()
{
int kase;
cin>>kase;
while(kase--)
{
n = read(), q = read(), ans = 0;
a[0] = a[n+1] = 0;
rep(i,1,n) a[i] = read();
rep(i,1,n) check(i);
cout<<ans<<endl;
rep(i,1,q)
{
ll l = read(), r = read();
map<int,int> Map;
rep(j,0,2) if(!Map[l+dir[j]]) Map[l+dir[j]] = 1, Delete(l+dir[j]);
rep(j,0,2) if(!Map[r+dir[j]]) Map[r+dir[j]] = 1, Delete(r+dir[j]);
Map.clear();
swap(a[l], a[r]);
rep(j,0,2) if(!Map[l+dir[j]]) Map[l+dir[j]] = 1, check(l+dir[j]);
rep(j,0,2) if(!Map[r+dir[j]]) Map[r+dir[j]] = 1, check(r+dir[j]);
cout<<ans<<endl;
}
}
return 0;
}

C2. Pokémon Army (hard version) CF #672的更多相关文章

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

    Codeforce 1420 C2. Pokémon Army (hard version) 解析(思維) 今天我們來看看CF1420C2 題目連結 題目 略,請直接看原題. 前言 根本想不到這個等價 ...

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

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

  3. Codeforces Round #672 (Div. 2) C1. Pokémon Army (easy version) (DP)

    题意:给你一组数\(a\),构造一个它的子序列\(b\),然后再求\(b_1-b2+b3-b4...\),问构造后的结果最大是多少. 题解:线性DP.我们用\(dp1[i]\)来表示在\(i\)位置, ...

  4. Pokémon Army (easy version) CodeForces - 1420C1 dp

    题意: 给你一个长度为n个序列v,你需要从中找一个子序列.这个子序列的值等于:子序列中奇数下标的值-偶数下标的值 你需要使得这个值尽可能大,让你输出这个最大值 题解: dp[i][0]表示:在原序列从 ...

  5. Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version)【模拟】

    一 题面 C2. Increasing Subsequence (hard version) 二 分析 需要思考清楚再写的一个题目,不能一看题目就上手,容易写错. 分以下几种情况: 1 左右两端数都小 ...

  6. CF 672 div2 D

    http://codeforces.com/contest/672/problem/D 题目大意: 有n个人,每个人有pi的钱,然后可以由如下操作,每次都可以挑选一个最富有的人,把它的钱给最穷的人.但 ...

  7. Codeforces Round #555 (Div. 3) C2. Increasing Subsequence (hard version) (贪心)

    题意:给你一组数,每次可以选队首或队尾的数放入栈中,栈中元素必须保持严格单增,问栈中最多能有多少元素,并输出选择情况. 题解:首先考虑队首和队尾元素不相等的情况,如果两个数都大于栈顶元素,那么我们选小 ...

  8. Codeforces Round #658 (Div. 2) C2. Prefix Flip (Hard Version) (构造)

    题意:给你两个长度为\(n\)的01串\(s\)和\(t\),可以选择\(s\)的前几位,取反然后反转,保证\(s\)总能通过不超过\(2n\)的操作得到\(t\),输出变换总数,和每次变换的位置. ...

  9. Codeforces Round #672 (Div. 2)

    比赛链接:https://codeforces.com/contest/1420 A. Cubes Sorting 题意 给出一个大小为 $n$ 的数组 $a$,每次只可以交换相邻的两个元素,最多交换 ...

  10. Codeforces Round #672 (Div. 2) A - C1题解

    [Codeforces Round #672 (Div. 2) A - C1 ] 题目链接# A. Cubes Sorting 思路: " If Wheatley needs more th ...

随机推荐

  1. eolinker脚本代码[Javascript]:通过判断返回码决定是否中止执行脚本

    场景描述: 请求返回码(code)不等于0时,整个脚本停止执行,并抛出信息 具体脚本: if (JSON.parse(result_api_1.response).Code != "0&qu ...

  2. 借助 QT 的反射机制实现数据类的序列化

    在 C++ 工程中经常需要使用数据类,并对数据类进行存储.打印.调试等操作.由于数据类中有大量数据字段,每次都编写存储或输出数据内容,工作重复量太大.C++ 不支持用户自定义的注解,所以没办法使用类似 ...

  3. CS及免杀

    Strategic Cyber 责任有限公司发行了适用于 Windows.Linux 和 MacOS X 的 Cobalt Strike 软件包. 要安装 Cobalt Strike,只需将其存档解压 ...

  4. 移动web开发——flex布局

    目录 1.0传统布局和flex布局对比 1.1传统布局 1.2 flex布局 1.3 建议 2.0 flex布局原理 3.0 父项常见属性 3.1 flex-direction设置主轴的方向 3.2 ...

  5. servlet web.xml配置

    url-pattern定义匹配规则,取值说明: 精确匹配 /具体的名称 只要url路径是集体的名称的时候才会触发Servlet 后缀匹配 *.xxx 只要是以xxx结尾的就匹配触发Servlet 通配 ...

  6. Axure RP中后台管理系统通用原型模板元件库

    Axure RP中后台管理系统通用原型方案 v2是一套通用型的中后台信息系统原型方案,可以快速扩展并输出标准美观的中后台产品原型,极大的提升输出效率和节省协作成本.方案中提供了几十套不同风格和结构的系 ...

  7. 【Elasticsearch】一文读懂ES向量搜索:原理剖析与技术全景

    大家好,我是大任,今天给大家分享一下Elasticsearch的向量搜索技术 注:本文若未说明ES版本则为7.10,其他版本会特别标记,由于ES版本不同,部分差异较大,具体请以官方文档为准 一.向量搜 ...

  8. 剪枝在pytorch中是如何实现的?

    Pytorch中剪枝源码可参考: https://github.com/pytorch/pytorch/blob/master/torch/nn/utils/prune.py 可参考: pytorch ...

  9. 网络编程:UDP connect连接

    UDP connect的作用 UDP connect函数的调用,并不会引起像TCP连接那样,和服务器目标端网络交互,并不会触发所谓的"握手"报文发送和应答. UDP套接字进行con ...

  10. Spring注解之@Value注解读取配置文件属性和设置默认值

    概述   在Spring 组件中,通常使用@Value注解读取 properties 文件的配置值.但如果在配置文件或启动参数中未指定对应的参数值,则项目在启动的时候会抛出异常,导致服务启动失败,异常 ...