传送门


problem

给定 nnn 个数,第 i(1≤i≤n)i(1\le i\le n)i(1≤i≤n) 个位置上的值为 xix_ixi​,有 mmm 个操作,操作有以下两种:

  • 1 pos v:将 xxx 数组中位置 pospospos 上的数字改为 vvv;
  • 2 l r u:选择 xxx 数组 [l,r][l,r][l,r] 中的某连续三个数加 uuu,新得到的数组称为 yyy,求所有可能形成的 yyy 数组的各元素绝对值之和的最大值(操作 222 不会改变 xxx 数组)。

数据范围:3≤n,m≤1053\le n,m\le 10^53≤n,m≤105。


solution

由于会有三个绝对值的变化,设 ∣a∣+∣b∣+∣c∣→∣a+u∣+∣b+u∣+∣c+u∣|a|+|b|+|c|\rightarrow |a+u|+|b+u|+|c+u|∣a∣+∣b∣+∣c∣→∣a+u∣+∣b+u∣+∣c+u∣,考虑暴力拆开:

+a+v+b+v+c+v=a+b+c+3v−a−v+b+v+c+v=−a+b+c+v+a+v−b−v+c+v=a−b+c+v−a−v−b−v+c+v=−a−b+c−v+a+v+b+v−c−v=a+b−c+v−a−v+b+v−c−v=−a+b−c−v+a+v−b−v−c−v=a−b−c−v−a−v−b−v−c−v=−a−b−c−3v\begin{aligned} +a+v+b+v+c+v&=a+b+c+3v\\ -a-v+b+v+c+v&=-a+b+c+v\\ +a+v-b-v+c+v&=a-b+c+v\\ -a-v-b-v+c+v&=-a-b+c-v\\ +a+v+b+v-c-v&=a+b-c+v\\ -a-v+b+v-c-v&=-a+b-c-v\\ +a+v-b-v-c-v&=a-b-c-v\\ -a-v-b-v-c-v&=-a-b-c-3v \end{aligned}+a+v+b+v+c+v−a−v+b+v+c+v+a+v−b−v+c+v−a−v−b−v+c+v+a+v+b+v−c−v−a−v+b+v−c−v+a+v−b−v−c−v−a−v−b−v−c−v​=a+b+c+3v=−a+b+c+v=a−b+c+v=−a−b+c−v=a+b−c+v=−a+b−c−v=a−b−c−v=−a−b−c−3v​

暴力维护一下以上 888 种结果,最后的答案一定是最大的那个。用线段树维护即可。

时间复杂度 O(nlog⁡n)O(n\log n)O(nlogn)。


code

#include<bits/stdc++.h>
#define N 100005
#define ll long long
using namespace std;
int n,m;
ll a[N],SUM,val,ans;
int K[8][4]={1, 1, 1, 3,1, 1,-1, 1,1,-1, 1, 1,-1, 1, 1, 1,1,-1,-1,-1,-1, 1,-1,-1,-1,-1, 1,-1,-1,-1,-1,-3
};
ll Abs(ll x)  {return x>0?x:-x;}
namespace SGT{ll mx[N<<2][10];void pushup(int root){for(int i=0;i<8;++i)mx[root][i]=max(mx[root<<1][i],mx[root<<1|1][i]);}#define mid ((l+r)>>1)void build(int root,int l,int r){if(l==r){for(int i=0;i<8;++i)mx[root][i]=K[i][0]*a[l]+K[i][1]*a[l+1]+K[i][2]*a[l+2]-Abs(a[l])-Abs(a[l+1])-Abs(a[l+2]);return;}build(root<<1,l,mid),build(root<<1|1,mid+1,r);pushup(root);}void Modify(int root,int l,int r,int pos){if(l==r){for(int i=0;i<8;++i)mx[root][i]=K[i][0]*a[l]+K[i][1]*a[l+1]+K[i][2]*a[l+2]-Abs(a[l])-Abs(a[l+1])-Abs(a[l+2]);return;}if(pos<=mid)  Modify(root<<1,l,mid,pos);else  Modify(root<<1|1,mid+1,r,pos);pushup(root);}ll Query(int root,int l,int r,int x,int y,int id){if(l>=x&&r<=y)  return mx[root][id];if(y<=mid)  return Query(root<<1,l,mid,x,y,id);if(x> mid)  return Query(root<<1|1,mid+1,r,x,y,id);return max(Query(root<<1,l,mid,x,y,id),Query(root<<1|1,mid+1,r,x,y,id));}void update(int pos){if(pos>=1&&pos<=n-2)  Modify(1,1,n-2,pos);if(pos>=2&&pos<=n-1)  Modify(1,1,n-2,pos-1);if(pos>=3&&pos<=n  )  Modify(1,1,n-2,pos-2);}#undef mid
}
int main(){scanf("%d%d",&n,&m);for(int i=1;i<=n;++i)  scanf("%lld",&a[i]),SUM+=Abs(a[i]);SGT::build(1,1,n-2);int op,pos,l,r;while(m--){scanf("%d",&op);if(op==1){scanf("%d%lld",&pos,&val);SUM-=Abs(a[pos]),a[pos]=val,SUM+=Abs(val),SGT::update(pos);}else{scanf("%d%d%lld",&l,&r,&val),ans=-1e15;for(int i=0;i<8;++i)  ans=max(ans,SGT::Query(1,1,n-2,l,r-2,i)+K[i][3]*val);printf("%lld\n",ans+SUM);}}return 0;
}

「SCOI 2018 D2T1」Pipi 酱的日常相关推荐

  1. 【题解】LOJ2350:「JOI 2018 Final」月票购买

    原题传送门 可以很套路地得到一个结论,答案与月票的路径有一段连续的重复路径 以 s , t , u , v s,t,u,v s,t,u,v为起点跑四次最短路 现在我们枚举两个月票最短路上的点 x , ...

  2. 2018 中国互联网哈哈榜之「十大 CP」

    作者 | 刘兴亮 本文经授权转自刘兴亮时间(ID:liu_xingliang) 在互联网江湖中最有趣且最有看点的,还属江湖人物.相对于单个人物来说,组合更有看点,所以这篇文章就来给大家盘点一下,201 ...

  3. 337调查之「普遍排除令」简介及2018年度典型案例探讨

    「咦?明明公司产品并没有在美国被告专利侵权,为何因为专利问题在美国海关被挡下来了?」这种看似不可思议的情形.在美国是很可能发生的,尤其是面向一般大众类型的消费性产品.这情况称背后的可能原因是因为该产品 ...

  4. 「JOISC 2018 Day 3」比太郎的聚会

    「JOISC 2018 Day 3」比太郎的聚会 题意: ​ 给你一个\(DAG\),若干组询问,每次给出一个终点和若干个点,问从给出点以外的点出发,到达终点的最长路.(\(|V|\leq 1e5 | ...

  5. LibreOJ 6514. 「雅礼集训 2018 Day10」文明【虚树+LCA】

    6514. 「雅礼集训 2018 Day10」文明 [题目描述] 传送门 [题解] 考虑笨蛋的写法,可以用LCA求出1号和其他点的中点,然后DFS搜索Size大小即可,但是,复杂度显然要炸,但是我们会 ...

  6. Loj #6503. 「雅礼集训 2018 Day4」Magic

    Loj #6503. 「雅礼集训 2018 Day4」Magic 题目描述 前进!前进!不择手段地前进!--托马斯 · 维德 魔法纪元元年. 1453 年 5 月 3 日 16 时,高维碎片接触地球. ...

  7. 国际象棋机器人夹断7岁男孩手指,原因是「棋手违反安全规则」?

    机器之心报道 编辑:蛋酱 万幸的是伤势不重,这位 7 岁的棋手第二天回到了赛场,并照常完成了比赛. 据俄罗斯通讯社塔斯社报道,在上周的莫斯科国际象棋公开赛上,一个国际象棋机器人折断了一名 7 岁男孩的 ...

  8. 「AI 质检员」在富士通上岗,效率比人工高 25%

    日本第一 IT 厂商富士通,于近日宣布开发了用于检测产品外观异常的 AI 技术,从而节省人力成本.材料成本等,同时也可节省声誉损失和退货/召回相关的成本,「无人工厂」已来. 来源 | Hyper超神经 ...

  9. 「留光」1小时:中科大让我们离「量子U盘」又近了一步

    视学算法报道 转载自:机器之心 编辑:张倩.小舟 「简单来说,我们就是用一块晶体把光『存起来』,一个小时后取出来发现,它的相位.偏振等状态信息还保存得很好.」 存储器的功能就是把信息存储起来,直到需要 ...

最新文章

  1. 别再乱用 Prometheus 联邦了,分享一个 Prometheus 高可用新方案
  2. 【二叉树系列】二叉树课程大作业
  3. 2017.4.23 税收与补贴问题 思考记录
  4. LC5软件破解用户口令
  5. 常兴老师--华为公司营销课程设计专家
  6. Eclipse debug 的 drop to frame 的技巧
  7. 2021-08-26小白笔记
  8. 外卖行业现状分析_外卖行业生存现状分析:你还会点外卖吗?
  9. Behavior tree 编程实战
  10. Windows10+CentOS 7 双系统安装
  11. Realtek 1296 (RTD1296) OpenWRT Android 双系统全功能开发板
  12. 100首经典广告背景音乐
  13. 手机测试相关基础知识
  14. ReactNative基础(四)了解ListView的使用、实现GridView效果、编写一个真实网络请求案例
  15. 树莓派2model B 通过蓝牙实现A2DP协议连接手机播放音乐
  16. 如何使用开源工具「DataEase」制作一个高质量的仪表板
  17. 知网搜论文没有服务器响应,CNKI知网论文检测使用中的十四个常见问题
  18. Structured Streaming简介
  19. node操作文件夹复制与删除
  20. java-net-php-python-59jspm职工工作量统计系统计算机毕业设计程序

热门文章

  1. Django admin后台管理页面的常用设置
  2. NTU RGB+D动作识别数据集
  3. TCL加码半导体,能走好显示面板国产化最后一段路吗?
  4. 关于某蔡傅里叶变换课的思考(元旦前更新)
  5. JS实现简易图片时钟效果
  6. 银行c语言编程,c语言编程银行利率问题
  7. 成都自传-MoccA and 555
  8. 基于php的老年医疗保健管理系统
  9. css3 —— 扑克牌旋转/盾牌飞入
  10. 机器学习管道模型_使用连续机器学习来运行您的ml管道