线段树练习之——分块解法
来源:互联网 发布:广州淘宝进货都在哪里 编辑:程序博客网 时间:2024/06/03 16:10
orz xczhw大神
今天某大神跑过来跟我说来学分块吧,很有意思的
于是我就信了= =
对于一个点修改区间查询的数列,把原序列按照sqrt(n)大小为长度分块,每一个块处理它块内的权值和,要查询时,块内的暴力查询,块外直接使用预处理得到的结果sqrt(n)的时间内求出即可
设分块大小为M
如果查询点在一个块的头标记点(i%M),那么将这个点直接前进M步进入下一个块的头标记点即可
如果当前点在一个块内,但并不是头标记点,暴力把答案得出来即可
#include<iostream>#include<cstdio>#include<queue>#include<algorithm>#include<cmath>#include<cstring>using namespace std;const int maxn=2333333;int xl[maxn];int kuai[maxn];int n;void init(){ int y=sqrt(n); for(int i=0;i<n;i++){ kuai[i/y]+=xl[i]; }}void change(int a,int v){ int y=sqrt(n); xl[a]+=v; kuai[a/y]+=v;}int ask(int a,int b){ int y=sqrt(n); int ans=0; while(a<=b){ if(!(a%y)&&a+y<=b){ ans+=kuai[a/y]; a+=y; } else{ ans+=xl[a]; a++; } } return ans;}int main(){ cin>>n; for(int i=0;i<n;i++){ scanf("%d",&xl[i]); } init(); //cout<<(int)sqrt(n)<<endl; int m; cin>>m; for(int i=1;i<=m;i++){ int x,a,b; scanf("%d%d%d",&x,&a,&b); if(x==1){ change(a-1,b); } if(x==2){ if(a>b) swap(a,b); cout<<ask(a-1,b-1)<<endl; } } return 0;}
0 0
- 线段树练习之——分块解法
- 形形色色的线段树练习——codevs线段树练习1-5:线段树,树状数组及分块模板
- HDU 1540 Tunnel Warfare线段树解法及分块解法
- 【codevs 1080】线段树练习 之 花样解法
- Codevs2038 线段树练习3(分块)
- Codevs 4927 线段树练习5(分块)
- HDU1166敌兵布阵 分块解法,分块练习
- Codevs 1082 线段树练习 3(线段树&&分块)
- JD2943——线段树、树套树、分块(线段树裸题)
- CodeVS 1080 线段树练习 分块 块状数组
- 分块【线段树模板】
- 【CodeVS】1080 线段树练习 分块 线段树 树状数组 开放性
- Codevs 1080 线段树练习(线段树&&树状数组&&分块&&CDQ分治)
- Codevs 1081 线段树练习 2(线段树&&树状数组&&分块)
- BZOJ 2141 分块 线段树
- bzoj2957分块或线段树
- 线段树学习——TOJ 练习
- 2016夏季练习——线段树
- 成员变量和局部变量的区别
- window.open() 父子页面的传参&传值问题
- 摇一摇 怎么实现
- 记录个小问题:解决SSH中的Host key verification failed
- jqueryeasy ui 的 accordion 和 tabs控件
- 线段树练习之——分块解法
- Android的TextView使用Html来处理图片显示、字体样式、超链接等
- ajax跨域访问服务器
- mysql 连接url中useUnicode=true&characterEncoding=UTF-8 的作用
- Xcode技巧 - 3
- js进行页面传值
- 用enum类型数据解决switch case选择字符串的问题
- ORA-00257: 归档程序错误。在释放之前仅限于内部连接
- Android的TextView/EditText使用CharacterStyle&SpannableString来处理图片显示、字体样式、超链接等