当前位置: 首页 > news >正文

分块总结:时髦之裤

说白了就是南外分块题做的差不多了,来写一篇总结。

简要题意: 给一序列 a,初始时 a i = i a_i=i ai=i,有如下两个操作:
1.将[l,r]每个数改为x,该点增加贡献 ∣ a i − x ∣ |a_i-x| aix.
2.询问[l,r]贡献和

样例:

10 4
1 2 7 9
2 1 10
1 3 8 12
2 1 10
27
46

范围1e5.


是的,如果不是刻意往分块上想,估计我怎么也想不到是分块。

注意到 ∣ a i − x ∣ |a_i-x| aix,线段树不好做,带修莫队不太会,发现数据范围1e5, n n n\sqrt n nn 可以过,大胆考虑分块,假设初始序列 a i = 0 a_i=0 ai=0,发现每次修改只会破坏两个块于是我们可以将颜色相同的块与颜色不同的块分开修改,复杂度不超过 4 n 4\sqrt n 4n

是的,这就是正解。正确性显然,考虑复杂度证明。
每个修改只会破坏两个块,故q次询问只会破坏2q个块,加上由题意原来就破碎的 n \sqrt n n 个块,均摊复杂度不超过 5 n 5\sqrt n 5n ,常数够小,稳过。

从代码注释可以看出我有多急(

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+5;
int n,m,B;
LL bz[350],a[N],res[N],totres[N],sum[350],L[350],R[350],ta[350];  //sum:one block,whole res:one block,broken.
void Turn(int l,int r,int x){int ql=l/B;if(bz[ql]) for(int i=l;i<=r;i++) res[i]+=abs(a[i]-x),totres[ql]+=abs(a[i]-x),a[i]=x;else{bz[ql]=1;for(int i=L[ql];i<=R[ql];i++) a[i]=ta[ql];   //ql->i once again!!for(int i=l;i<=r;i++) res[i]+=abs(ta[ql]-x),totres[ql]+=abs(ta[ql]-x),a[i]=x;  //ql->i debug 2h!!!}
}
void update(int l,int r,int x){int ql=l/B,qr=r/B;if(ql==qr){Turn(l,r,x);return ;}Turn(l,(ql+1)*B-1,x);Turn(qr*B,r,x);for(int i=ql+1;i<qr;i++){if(!bz[i]){sum[i]+=abs(ta[i]-x);ta[i]=x;}else{for(int j=i*B;j<(i+1)*B;j++) res[j]+=abs(a[j]-x),totres[i]+=abs(a[j]-x);ta[i]=x;bz[i]=0;}}
}
LL query(int l,int r){int ql=l/B,qr=r/B;LL ans=0;if(ql==qr){for(int i=l;i<=r;i++) ans+=res[i]+sum[ql];return ans;}for(int i=l;i<(ql+1)*B;i++) ans+=res[i]+sum[ql];for(int i=qr*B;i<=r;i++) ans+=res[i]+sum[qr];for(int i=ql+1;i<qr;i++) ans+=sum[i]*(R[i]-L[i]+1)+totres[i];return ans;
}
int main(){freopen("a.in","r",stdin);scanf("%d%d",&n,&m);B=sqrt(n);for(int i=0;i<=n/B;i++) L[i]=max(1,i*B),R[i]=min(n,(i+1)*B-1);
//	for(int i=1;i<=n;i++) printf("%d %d\n",L[i/B],R[i/B]);for(int i=1;i<=n;i++) a[i]=i,bz[i/B]=1;while (m--){int op,l,r;scanf("%d",&op);if(op^2){int x;scanf("%d%d%d",&l,&r,&x);update(l,r,x);}else{scanf("%d%d",&l,&r);// for(int i=l;i<=r;i++) printf("a:%d ta:%d res:%lld sum:%lld\n",a[i],ta[i/B],res[i],sum[i/B]);printf("%lld\n",query(l,r));}}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Redis相关命令详解
  • 数据的二进制形式
  • 计算机视觉学习路线
  • Python基础语法(3)上
  • 流量牵引技术与传统防火墙的区别
  • 半导体AI硬件基础设施发展洞察
  • 【Canvas与表盘】绘制黄蓝两色简约表盘
  • 免费线上研讨会 | Ansys Zemax 设计医疗内窥镜
  • 【C#】命名规范
  • SAP 工厂间的库存转移简介
  • 电脑安装OpenWRT系统
  • 计算机网络第五章--传输层
  • 带你0到1之QT编程:十、一举击破开发中常用的Button按钮组
  • Redis 缓存淘汰算法策略详解
  • python制作石头剪刀布
  • C++11: atomic 头文件
  • centos安装java运行环境jdk+tomcat
  • CSS 三角实现
  • Docker入门(二) - Dockerfile
  • Hibernate【inverse和cascade属性】知识要点
  • jquery cookie
  • Laravel 中的一个后期静态绑定
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • Python爬虫--- 1.3 BS4库的解析器
  • React组件设计模式(一)
  • SAP云平台里Global Account和Sub Account的关系
  • VuePress 静态网站生成
  • windows下mongoDB的环境配置
  • 技术:超级实用的电脑小技巧
  • 应用生命周期终极 DevOps 工具包
  • 我们雇佣了一只大猴子...
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • 整理一些计算机基础知识!
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​字​节​一​面​
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #if 1...#endif
  • (Windows环境)FFMPEG编译,包含编译x264以及x265
  • (八)光盘的挂载与解挂、挂载CentOS镜像、rpm安装软件详细学习笔记
  • (笔试题)合法字符串
  • (补充)IDEA项目结构
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (翻译)terry crowley: 写给程序员
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (黑马点评)二、短信登录功能实现
  • (论文阅读40-45)图像描述1
  • (一)u-boot-nand.bin的下载
  • (转)memcache、redis缓存
  • ./和../以及/和~之间的区别
  • .env.development、.env.production、.env.staging
  • .NET HttpWebRequest、WebClient、HttpClient
  • .Net IE10 _doPostBack 未定义
  • .NET MVC第三章、三种传值方式
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地定义和使用弱事件
  • .Net6 Api Swagger配置