[Ynoi2015]纵使日薄西山
题目大意:
给定一个序列,每次单点修改,然后进行询问。
定义一次操作为,选择一个位置$x$,将这个位置的数和左边、右边两个位置的数(不存在则忽略)各减去1,然后和0取max。
对序列中最大的位置进行一次操作(相同则取最前面的),不断重复,直到所有位置为0为止。
问执行了多少次操作。
询问互相独立(即下一次询问的序列并不是全0)。
解题思路:
在太阳西斜的这个世界里,置身天上之森。等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去、逐渐消逝的未来。我回来了,纵使日薄西山,即便看不到未来,此时此刻的光辉,盼君勿忘。————世界上最幸福的女孩
我的愿望是,和珂朵莉一样可爱。
淦不动辣QaQ就窝一个在那瞎分块
一开始的做法是先分块,求出块内的答案,然后瞎分类讨论(自闭了QAQ)。
实际上这个性质挺优美的为啥窝就是发现不了啊
显然一次对某个位置操作到底,和答案是一样的(当你选择这个数进行操作后,其左边和右边就永远不会被操作。而其他数对这个位置无影响)。
所以相当于求所有会被操作的位置上的数的和。
考虑一个单调递增或单调递减的序列,在这上面选的数一定是一个选一个不选(奇偶性相同)。
所以我们对奇数、偶数位置分别用树状数组维护一下,然后用set记录序列的极大、极小值的位置。则可以快速计算出两个极值之间的区间的贡献。
然后对于单点修改,对受到影响的部分区间重新计算贡献即可。
细节挺多的,比如对极小值是否取到的考虑(仅当其左右两个极大值的位置的奇偶性和这个极小值位置相同时,才能取到这个值)。
时间复杂度$O(n\log n)$。
C++ Code:
#include<cstdio>
#include<set>
const int N=1e5+6;
typedef long long LL;
int n,a[N];
struct BIT{
LL b[N];
inline void add(int i,int x){for(;i<N;i+=i&-i)b[i]+=x;}
inline LL ask(int i){LL x=0;for(;i;i^=i&-i)x+=b[i];return x;}
}odd,even;
std::set<int>s;
LL ans=0;
LL get(int x){
if(x<1||x>n)return 0;
auto it=s.find(x);
if(*it==1){
auto nxt=it;++nxt;
if(a[*it]<a[*nxt]){
if(*nxt&1)return odd.ask(*nxt-1)-odd.ask(*it-1);else
return even.ask(*nxt-1)-even.ask(*it-1);
}else return 0;
}
if(*it==n){
auto pre=it;--pre;
if(a[*pre]>=a[*it]){
if(*pre&1)return odd.ask(*it)-odd.ask(*pre-1);else
return even.ask(*it)-even.ask(*pre-1);
}else return a[n];
}
auto pre=it,nxt=it;--pre,++nxt;
if(a[*pre]>=a[*it]&&a[*it]<a[*nxt]){
LL ret=0;
if(*pre&1)ret+=odd.ask(*it-1)-odd.ask(*pre-1);else
ret+=even.ask(*it-1)-even.ask(*pre-1);
if(*nxt&1)ret+=odd.ask(*nxt-1)-odd.ask(*it);else
ret+=even.ask(*nxt-1)-even.ask(*it);
if((*pre&1)==(*it&1)&&(*nxt&1)==(*it&1))ret+=a[*it];
return ret;
}else return 0;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",a+i),((i&1)?odd:even).add(i,a[i]);
s.insert(-2),s.insert(-1),s.insert(n+2),s.insert(n+3);
s.insert(1);
for(int i=2;i<n;++i)
if(a[i-1]<a[i]&&a[i]>=a[i+1]||a[i-1]>=a[i]&&a[i]<a[i+1])s.insert(i);
s.insert(n);
for(int i:s)
ans+=get(i);
int q;
for(scanf("%d",&q);q--;){
int x,y;
scanf("%d%d",&x,&y);
int nxt=*s.upper_bound(x),pre=*--s.lower_bound(x);
ans-=get(nxt),ans-=get(pre);
nxt=*s.upper_bound(nxt),pre=*--s.lower_bound(pre);
ans-=get(nxt),ans-=get(pre);
if(s.count(x))ans-=get(x),s.erase(x);
s.erase(x-1),s.erase(x+1);
if(x&1)odd.add(x,-a[x]),odd.add(x,y);else
even.add(x,-a[x]),even.add(x,y);
a[x]=y;
for(int i=x-1;i<=x+1;++i){
if(i<1||i>n)continue;
if(i==1||i==n)s.insert(i);else
if(a[i-1]<a[i]&&a[i]>=a[i+1]||a[i-1]>=a[i]&&a[i]<a[i+1])s.insert(i);
}
for(auto l=s.find(pre),r=s.upper_bound(nxt);l!=r;++l)
ans+=get(*l);
printf("%lld\n",ans);
}
return 0;
}
[Ynoi2015]纵使日薄西山的更多相关文章
- 洛谷P5069 [Ynoi2015]纵使日薄西山(树状数组,set)
洛谷题目传送门 一血祭 向dllxl致敬! 算是YNOI中比较清新的吧,毕竟代码只有1.25k. 首先我们对着题意模拟,寻找一些思路. 每次选了一个最大的数后,它和它周围两个数都要减一.这样无论如何, ...
- 【树状数组】【P5069】[Ynoi2015]纵使日薄西山
Description 给定一个长度为 \(n\) 的非负整数序列 \(\{a_n\}\),\(q\) 次操作,每次要么单点修改序列某个值,要么查询整个序列需要操作多少次才能变成全 \(0\). 一次 ...
- [Ynoi2015]即便看不到未来
题目大意: 给定一个序列,每次询问,给出一个区间$[l,r]$. 设将区间内的元素去重后重排的数组为$p$,求$p$中长度为$1\sim 10$的极长值域连续段个数. 长度为$L$的极长值域连续段的定 ...
- [Ynoi2015]盼君勿忘
题目大意: 给定一个序列,每次查询一个区间\([l,r]\)中所有子序列分别去重后的和\(\bmod p\)(每次询问模数不同). 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后 ...
- [Ynoi2015]我回来了
题目大意: 给定一张无向无权图,每次给定若干个二元组\((x_i,y_i)\),定义点\(u\)满足条件,当且仅当存在\(i\),并满足\(dist(u,x_i)\leqslant y_i\)(\(d ...
- [Ynoi2015]此时此刻的光辉
题目大意: 给定一个序列,每次询问一段区间的数的乘积的约数个数. 解题思路: 在太阳西斜的这个世界里,置身天上之森.等这场战争结束之后,不归之人与望眼欲穿的众人, 人人本着正义之名,长存不灭的过去.逐 ...
- 「Ynoi2015」我回来了
「Ynoi2015」我回来了 这东西已经不是 Ynoi 了,因为太水被嫌弃了. 如何提升自己的数据结构能力?从Ynoi做起 题目链接 其实这个题很小清新的辣,而且不卡常. 由于边权为 \(1\),所以 ...
- 洛谷P5072 [Ynoi2015]盼君勿忘 [莫队]
传送门 辣鸡卡常题目浪费我一下午-- 思路 显然是一道莫队. 假设区间长度为\(len\),\(x\)的出现次数为\(k\),那么\(x\)的贡献就是\(x(2^{len-k}(2^k-1))\),即 ...
- 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉
众所周知lxl是个毒瘤,Ynoi道道都是神仙题,题面好评 原题传送门 一看这题没有修改操作就知道这是莫队题(我也只会莫队) 我博客里对莫队的简单介绍 一个数N可以分解成\(p_1^{c_1}p_2^{ ...
随机推荐
- HTML_项目符号使用图片
本文出自:http://blog.csdn.net/svitter 创建一个HTML页面. 其内容为一个无序列表. 列表中至少包括了5本畅销书,每本书之前的项目符号必须採用概述封面的缩略图. 这些信息 ...
- 开源 java CMS - FreeCMS2.3 职位管理
项目地址:http://www.freeteam.cn/ 职位管理 管理职位.实现招聘功能. 1. 职位管理 从左側管理菜单点击职位管理进入. 2. 加入职位 在职位列表下方点击"加入&qu ...
- Codeforces Round #306 (Div. 2) A
题意 给一个字符串(长度<=10^5).问当中有没有一个"BA"和一个"AB"呢?假设都有而且它们不反复(即ABA不算),输出YES.否则输出NO. 思路 ...
- [洛谷0925]NOIP模拟赛 个人公开赛 OI
P3395 路障 题目背景 此题约为NOIP提高组Day1T1难度. 题目描述 B君站在一个n*n的棋盘上.最开始,B君站在(1,1)这个点,他要走到(n,n)这个点. B君每秒可以向上下左右的某个 ...
- C# Path 有关于文件路径等问题类(转)
C# Path 标签:C#, Path C-Sharp 0 Path handles file path processing. The .NET Framework provides effect ...
- 关于MFC控件删除出现“具有该ID的控件已存在”这样的情况的解决方案,详细,网上都没有这么详细的,我是“深受其害”,所以想将详细的方法分享出去。
网上关于MFC控件删除出现“具有该ID的控件已存在”这样的情况,在网上找了很多关于这方面的东西,但是都不是很全,也不容易弄明白.现在问我直接通过一个项目和图片的形式和大家一块分享一个这个解决方法(如有 ...
- PCB 周期计算采用 SQL 函数调用.net Dll 标量函数 实现
PCB 周期计算采用 SQL函数调用.net Dll实现 (实现代码重用目的) 玩过SQL SERVER数据库经常经需要写存储过程,函数之类的,当业务逻辑过于复杂,用SQL去写简直是恶梦, 这里以PC ...
- js开发规范,在php上也适用
本篇主要介绍JS的命名规范.注释规范以及框架开发的一些问题. 目录 1. 命名规范:介绍变量.函数.常量.构造函数.类的成员等等的命名规范 2. 注释规范:介绍单行注释.多行注释以及函数注释 3. 框 ...
- bzoj1705[Usaco2007 Nov]Telephone Wire 架设电话线(dp优化)
1705: [Usaco2007 Nov]Telephone Wire 架设电话线 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 441 Solved: ...
- js点击特效
//点击效果博客页面点击就可以看到 <script type="text/javascript"> !function(e, t, a) { function n() ...