题目链接


题目大意:就算给你一序列,按照顺序出若干个数组成一个的序列,然后对这个序列定义一个权值就算奇数位置的和减去偶数位置的和,问你能的到的最大的权值是多少?
**a1 - a2 + a3 - a4 + a5 … **


解题思路:1.就是我们观擦一下:就任意多个ai - aj的组合;最后的就是an - 0;
2.我们可以用差分的思想:ai就是差分数组前i位的前缀和,那么ai-aj就是差分数组的区间和,就是贪心挑出任意多个差分大于0的区间求他们的和
3.我们发现如果这个区间内部有出现+配-配+但是总的sum还是+,那么我们最优还可以直接列成两个全是正的小区间,那么最优
4.那么综上所述:我们那么其实就算把差分任意两个相邻的ai-ai+1的大于0的和
5.那么对于交换操作:我们知道改变的只有两个数,那么对差分数组的影响只有4位置,那么就可以O(1)更新答案
注意一点就是:a[n+1] = 0,因为最后一定是+一个数而已相当于-0


代码:


#include <iostream>
#include <cstdio>
#include <stack>
#include <sstream>
#include <limits.h>
#include <vector>
#include <map>
#include <cstring>
#include <deque>
#include <cmath>
#include <iomanip>
#include <unordered_map>
#include <queue>
#include <algorithm>
#include <set>
#define mid ((l + r) >> 1)
#define Lson rt << 1, l , mid
#define Rson rt << 1|1, mid + 1, r
#define ms(a,al) memset(a,al,sizeof(a))
#define log2(a) log(a)/log(2)
#define _for(i,a,b) for( int i = (a); i < (b); ++i)
#define _rep(i,a,b) for( int i = (a); i <= (b); ++i)
#define for_(i,a,b) for( int i = (a); i >= (b); -- i)
#define rep_(i,a,b) for( int i = (a); i > (b); -- i)
#define lowbit(x) ((-x) & x)
#define IOS std::ios::sync_with_stdio(0); cin.tie(0); cout.tie(0)
#define INF 0x3f3f3f3f
#define LLF 0x3f3f3f3f3f3f3f3f
#define hash Hash
#define next Next
#define pb push_back
#define f first
#define s second
#define y1 Y
using namespace std;
const int N = 3e5 + 10, MOD = 1e9 + 7;
const int maxn = 2e5;
const long double eps = 1e-5;
const int EPS = 500 * 500;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> PLL;
typedef pair<double,double> PDD;
template<typename T> void read(T &x)
{x = 0;char ch = getchar();ll f = 1;while(!isdigit(ch)){if(ch == '-')f*=-1;ch=getchar();}while(isdigit(ch)){x = x*10+ch-48;ch=getchar();}x*=f;
}
template<typename T, typename... Args> void read(T &first, Args& ... args)
{read(first);read(args...);
}
ll a[N], b[N];
int T;
int n, q;
ll ans;inline void work(int pos, ll & ans)
{if(pos - 1 >= 1 && b[pos - 1] > 0) ans -= b[pos - 1];if(pos - 1 >= 1) b[pos - 1] = a[pos - 1] - a[pos];if(pos - 1 >= 1 && b[pos - 1] > 0) ans += b[pos - 1];if(b[pos] > 0) ans -= b[pos];b[pos] = a[pos] - a[pos + 1];if(b[pos] > 0) ans += b[pos];
}int main()
{IOS;cin >> T;while(T --){ans = 0;cin >> n >> q;a[n + 1] = 0;for(int i = 1; i <= n; ++ i)cin >> a[i];for(int i = 1; i <= n; ++ i)b[i] = a[i] - a[i + 1], ans += b[i] * (b[i] > 0);cout << ans << endl;while(q --){int l, r;cin >> l >> r;swap(a[l],a[r]);work(l,ans);work(r,ans);cout << ans << endl;}}return 0;
}

差分 ---- Codeforces Round #672 (Div. 2):C2. Pokémon Army (hard version)[差分的思想]相关推荐

  1. Codeforces Round #672 (Div. 2) C2 - Pokémon Army (hard version)(贪心,维护变化值)

    x数组里选一个子数组y(原数组顺序),y1-y2+y3-y4+- 的最大值 然后还有q次交换操作,每次修改之后都要输出新的最大值 (1)如果没有修改,单纯对于当前数组考虑,我们最后选出来的点肯定是波峰 ...

  2. Codeforces Round # 555 (Div. 3) C2. Increasing subsequence (complicated version) (贪心)

    题目链接:http://codeforces.com/contest/1157/problem/C2 当左右两边数字相同时,需要判断一下取哪边能得到更长的递增序列 #include <iostr ...

  3. Codeforces Round #568 (Div. 2)C2. Exam in BerSU (hard version)

    Codeforces Round #568 (Div. 2)C2. Exam in BerSU (hard version) 贪心+暴力 大致题意:N个人考试,每个人花费的时间是a[i],他们总共花费 ...

  4. Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version)

    Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version) 题目链接 There are two binary strings a an ...

  5. C2. Pokémon Army (hard version)

    C2. Pokémon Army (hard version) http://codeforces.com/problemset/problem/1420/C2 题解:序列是一个起伏的形状,答案其实就 ...

  6. C2. Pokémon Army (hard version)(贪心分治)

    C2. Pokémon Army (hard version) (贪心&分治) 思路:局部最优解→\rightarrow→全局最优解. 显然答案数组长度为奇数,因为ai>0a_i> ...

  7. Codeforces Round #636 (Div. 3) D. Constant Palindrome Sum 思维 + 差分

    传送门 文章目录 题意: 思路: 题意: 思路: 首先有一个显然的性质就是每组操作最多不会超过两次. 很容易想到一个很暴力的思路,就是枚举x∈[1,2∗k]x \in [1,2*k]x∈[1,2∗k] ...

  8. Codeforces Round #672 (Div. 2)

    A - Cubes Sorting 冒泡排序交换次数等于逆序对数,严格降序需要交换n(n−1)2\frac{n(n-1)}{2}2n(n−1)​次才能升序排列,由此只需要判断原数组是否严格降序即可. ...

  9. Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树

    传送门 文章目录 题意: 思路: 题意: 比如下面这个图: 思路: 对于这个题,比较容易就能考虑到dpdpdp,设f[i][j]f[i][j]f[i][j]为到了第iii行,覆盖了[j,j+k−1][ ...

最新文章

  1. 【matlab】pcolor和colormap的使用
  2. Python 文件和目录操作总结
  3. 微型计算机的发展通常以什么为指标,微型计算机的发展以什么技术作为指标?...
  4. mysql与dns_借助mysql和DNS view实现智能DNS(centos6.3 x64环境)
  5. 写作14个月,审稿花10年:这篇论文解决了数学物理界的大问题
  6. 2019/02/11-分布式数据库概述
  7. python源码中的学习笔记_第11章_模块与包
  8. 基于dpdk的用户态协议栈f-stack实现分析
  9. opencv无获取摄像头视频帧(YUV打开导致失败)
  10. iOS面试题大全(附带答案)
  11. 计算机网络--七层结构(三)传输层详解
  12. 工作流:如何将Word尾注转换为普通文本格式
  13. HTML Javascript CGI
  14. js实现缓慢回到页面顶部
  15. 男人婚后为何会对婚姻心生倦意?
  16. BeatMark X for mac(fcpx音乐卡点神器)
  17. Python爬虫(2)创建项目
  18. 怎样学习jQuery,jQuery学习教程
  19. 1.试用期个人工作总结(篇一)
  20. 联网下载jar包导入本地Maven库

热门文章

  1. 写 Python 代码不可不知的函数式编程技术
  2. 初学Python——文件操作第三篇
  3. 【社工】NodeJS 应用仓库钓鱼
  4. 了解过去与理解现在的一把钥匙
  5. 如何利用客户端在CU发博客
  6. Nginx + Tomcat 负载均衡集群配置
  7. [转]学习如何使用 Cookie 编程
  8. 将csv文件导入mysql
  9. xgboost api
  10. mysql普通索引标记_Mysql 索引