博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Ynoi2012]D1T1
阅读量:5040 次
发布时间:2019-06-12

本文共 1261 字,大约阅读时间需要 4 分钟。

套路的根号分治啊

我们设置一个值\(S\)

对于\(S\leq x\)的操作,我们直接暴力修改,显然这样只会修改\(\frac{n}{S}\)次,所以我们需要一个能够\(O(1)\)修改的数据结构,自然是首选分块

对于\(S>x\)的操作,我们对于每一个\(x\)维护一个块,我们维护这个块的前缀和就好了,复杂度是\(O(S)\)

查询的时候先用分块查一下区间和,复杂度\(O(S+\frac{n}{S})\),之后对于每一个\(x<S\)的块我们单独\(O(1)\)求一下,复杂度是\(O(S)\)

理论上自然是\(S=\sqrt{n}\)的时候取到了最优的复杂度,但是我们根据一些奇怪的常数原因,可以魔改一波块大小

代码

#include
#include
#include
#include
#include
#define re register#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))inline int read() { char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;}const int maxn=2e5+5;const int mod=1e9+7;int n,m,sz;int pr[500][500],sum[500];int pre[maxn],id[maxn],l[5000];inline int qm(int a) {return a>=mod?a-mod:a;}struct Block { int a[maxn],tag[5000]; inline void change(int pos,int v) { a[pos]=qm(a[pos]+v); tag[id[pos]]=qm(tag[id[pos]]+v); } inline int ask(int x) { int now=0; for(re int i=1;i
=sz) {while(y<=n) B.change(y,v),y+=x;continue;} sum[x]=(sum[x]+v)%mod; for(re int i=y;i<=x;i++) pr[x][i]=qm(pr[x][i]+v); } } return 0;}

转载于:https://www.cnblogs.com/asuldb/p/10853505.html

你可能感兴趣的文章
Mac 下的Chrome 按什么快捷键调出页面调试工具
查看>>
Windows Phone开发(24):启动器与选择器之发送短信
查看>>
JS截取字符串常用方法
查看>>
Google非官方的Text To Speech和Speech Recognition的API
查看>>
stdext - A C++ STL Extensions Libary
查看>>
Django 内建 中间件组件
查看>>
bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
mysql忘记root密码
查看>>
apache服务器中设置目录不可访问
查看>>
嵌入式Linux驱动学习之路(十)字符设备驱动-my_led
查看>>
【NOIP模拟】密码
查看>>
java容器---------手工实现Linkedlist 链表
查看>>
three.js 性能优化的几种方法
查看>>
《梦断代码》读书笔记(三)
查看>>
FreeMarker解析json数据
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>