传送门

最nb的就是这种算法简单思维困难的题。

题目说,选最大,将左中右三个一起减少。

使用瞪眼法你要发现一个性质:

修改一个数,那左中右的相对大小不变。所以它左右的数不会被修改,永远不会。因为其它数最多会使它们减少。

也就是说,我们要维护的其实是所有会被操作的数的和。

哪些数会被操作呢。

数列问题要考虑单调区间。

对于一个单调区间,从最高的那个点开始,我们会处理第一个,第三个,第五个,,这样的点。

也就是说,对于一个区间,我们只处理奇偶性相同的一些点。

所以我们考虑维护极端点,就是那些隔开区间的点点。用set装就行。

现在我们要想,修改一个点会影响哪些区间。举个栗子。如果原来是这样

1,9,7,9,1,。

如果把7修改成10,那首先影响了[9,7]和[7,9]这两个,变成不存在的区间。

其次使得[1,9]和[9,1]扩展了。所以会影响左右各两个区间总共四个。

在计算答案的时候,我们一个一个区间地修改,我使用了左开右闭表示。但是还有些细节:

比如这两个区间长成这个样子:5,3,8;我们发现对于[3,8]这个区间,3会被4修改。但我们一段一段计算,3会被[5,3]计算进去。所以我们要判断。也就是说,如果我和我右边的奇偶性不同,且我是低点,我就要减1。

而对于最左边那个端点,因为是左开右闭,我们要先确定这个端点是否计算。如果这个端点是一个低点,且和下一个点奇偶性相同,和上一个点奇偶性也相同,它才会在本次进入计算。否则,它早就在之前被计算了。

如此,你就可以水过去一个黑题。

#include<bits/stdc++.h>
using namespace std;
#define in read()
#define IT set<int>::iterator
#define int long long
int in{int cnt=0,f=1;char ch=0;while(!isdigit(ch)){ch=getchar();if(ch=='-')f=-1;}while(isdigit(ch)){cnt=cnt*10+ch-48;ch=getchar();}return cnt*f;
}
set<int> s;int ans;
int lowbit(int u){return u&(-u);
}
struct node{int t[100003];void update(int u,int key){while(u<=100000){t[u]+=key;u+=lowbit(u);}}int query(int u,int x){int sum=0;while(x){sum+=t[x];x-=lowbit(x);}while(u){sum-=t[u];u-=lowbit(u);}return sum;}
}b[2];int n,a[100003],q;
#define ODD(o) ((*l^*o(j=l))&1)//表示我和下一个或者上一个的奇偶性是否相同。
void calc(IT l,IT r,int inv){IT i,j;int sum=(*l&&(a[*l]<a[*l+1])&&!ODD(--)&&!(ODD(++)))?a[*l]:0;for(i=l++;i!=r;i=l++){if(a[*l]>a[*i])sum+=b[*l&1].query(*i,*l);else sum+=b[*i&1].query(*i,*l-ODD(++));}ans+=sum*inv;
}
void yzzkal(int pos){if((a[pos]<a[pos+1])!=(a[pos-1]<a[pos]))s.insert(pos);else s.erase(pos);
}
void update(int key,int pos){IT i=s.lower_bound(pos),l=i,r=i;--l;if(l!=s.begin())--l;++r;if(r==s.end()||(*i==pos)&&(++r==s.end()))--r;calc(l,r,-1);b[pos&1].update(pos,key-a[pos]);a[pos]=key;yzzkal(pos);if(pos>1)yzzkal(pos-1);if(pos<n)yzzkal(pos+1);calc(l,r,1);
}signed main(){n=in;s.insert(0);s.insert(n+1);for(int i=1;i<=n;i++)update(in,i);//cout<<ans<<"# "<<endl; q=in;while(q--){int x=in;int y=in;update(y,x);cout<<ans<<'\n';}return 0;
}

【洛谷5069】纵使日薄西山【set】【树状数组】相关推荐

  1. 洛谷P3688/uoj#291. [ZJOI2017]树状数组

    传送门(uoj) 传送门(洛谷) 这里是题解以及我的卡常数历程 话说后面那几组数据莫不是lxl出的这么毒 首先不难发现这个东西把查询前缀和变成了查询后缀和,结果就是查了\([l-1,r-1]\)的区间 ...

  2. 洛谷P3374 【模板】树状数组 1

    题目链接:[模板]树状数组 1 - 洛谷 模板题就不多说了 ac代码: #include <cstdio> #include <iostream> #include <a ...

  3. 洛谷P3368 【模板】树状数组 2(Python和C++代码)

    ##就是常规写法 用树状数组维护一个差分数组的前缀和,因为可推得若b[i]=a[i]-a[i-1],则a[i]=b[1]+-+b[i] (b[1]=a[1]-a[0],a[0]=0) . 可发现a[i ...

  4. [洛谷P1908] 逆序对|归并排序|树状数组

     题目描述 Description 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计.最近,TOM老猫查阅到一个人类称之为&qu ...

  5. 洛谷 P1908 逆序对(树状数组+离散化)

    题目描述 猫猫 TOM 和小老鼠 JERRY 最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你追我赶的游戏,现在他们喜欢玩统计. 最近,TOM 老猫查阅到一个人类称之为"逆序对& ...

  6. 洛谷P2448 无尽的生命 树状数组

    给出231−12^{31}-1231−1范围的1−n1-n1−n的数列,然后有不超过k≤1e5k\leq1e5k≤1e5次交换,求问最终的逆序对的个数是多少. 被交换的值不超过2k2k2k个,然后再考 ...

  7. 洛谷P2357 守墓人(差分+树状数组)

    原题链接 什么是差分? 7 8 6 5 8 18 20 35 //原数组 7 1 -2 -1 3 10 2 15 //差分数组 差分数组的前缀sum[i]即原数组的a[i] 我们构建两个树状数组 su ...

  8. 洛谷 P5149 会议座位(树状数组+Trie)

    题目是一道求逆序对的题目,但是我们先要将每一个名字转化为数字再进行计算 求逆序对的个数用树状数组或归并即可 题目有个坑点,名字包含大小写字母,所以字典树需要开大一点 #include <iost ...

  9. 洛谷P3374 【模板】树状数组 1(Python和C++代码)

    import math import sys import string import cmath import bisect import copy import heapq from collec ...

  10. 洛谷 P3368 【模板】树状数组 2

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...

最新文章

  1. 【c语言】蓝桥杯算法训练 斜率计算
  2. 创建cocos2dx lua 工程
  3. 微信小程序 列表的分页实现(最新的最简易的实现方式+思路,附代码)
  4. mysql innodb引擎--范围查询优化
  5. Common Lisp 函数 require 和 provide 源代码分析
  6. Android 原生ExoPlayer 解析
  7. SOLID 设计原则 In C# 代码实现
  8. PHP遍历文件夹下所有文件
  9. 设置mysql允许外网访问
  10. AS3文本框的操作,为密码框添加按钮
  11. 【智能车】模糊PID控制原理详解与代码实现
  12. 【番外篇】波动率的几种模型
  13. 阿里云服务器桌面版配置
  14. shell:sed 替换换行符
  15. 有关clipToPadding、 clipChildren的那些事
  16. 基于思维导图的研究生创新能力培养
  17. 前大灯是近光灯还是远光灯_大灯是近光灯还是远光灯
  18. ros ubuntu 卸载_ROS安装与卸载
  19. 交叉编译fw_printenv
  20. 27、extjs操作用友华表Cell之合并单元格

热门文章

  1. 《雨霖铃·寒蝉凄切》 柳永
  2. 前端 HTML(1)
  3. ogr2ogr导入导出数据。
  4. 虎年啦,小老虎5分钟带你学会Linux中的移动-改名(mv)
  5. Java实现 蓝桥杯 算法训练 天数计算
  6. loj #6247. 九个太阳
  7. outlook gmail setting
  8. Latex多个子图进行组合
  9. 怎么将pdf转换成excel
  10. [乡土民间故事_徐苟三传奇]第四二回_见洋广争啃西瓜皮