1081 线段树练习 2

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 大师 Master

题目描述 Description

给你N个数,有两种操作

1:给区间[a,b]的所有数都增加X

2:询问第i个数是什么?

输入描述 Input Description

第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。

输出描述 Output Description

对于每个询问输出一行一个答案

样例输入 Sample Input

3

1 2 3

2

1 2 3 2

2 3

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

数据范围

1<=n<=100000

1<=q<=100000

分析 Analysis

qwq阔别一年,终于能用分块写啦!

这段时间在网上翻了一些博客,也翻了蓝书和ACM模版小红书,发现分块写法风格实在是多样

像ACM红书(就清华大学出版社+俞勇主编那本ACMXXX《算法与实现》),里面写成了纯链表

蓝书写的就比较接近我现在的习惯,但是也是难以模仿

现在的分块类型总结如下:

A. 将数据完全存在各种块中(就是红书那种块状链表,一个节点保存一块的信息)

B. 将数据存在线性数组中,分块相关的附属信息用另外一个结构存,线性数组中每一个元素有对应的块编号

个人觉得B. 比较好写(其实是因为B.写对了)

个人觉得写的比较好的分块范例是在 1081线段树练习2 的题解里找到的,推荐!

显然,分块的风格还是挺多的

之前也听学长说分块很难写(因为细节部分容易出错)还难调(我是挺难调的= =)

不过还是推荐学一学

代码 Code

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<iostream>
 4 #define maxn 1000000
 5 using namespace std;
 6
 7 int size,arr[maxn],block[maxn],add[maxn],n,q,swi,a,b,c;
 8
 9 void modify(int a,int b,int c){
10     a--,b--;
11     for(int i = a;i <= min(block[a]*size-1,b);i++)
12         arr[i] += c;
13     if(block[a] != block[b]){
14         for(int i = (block[b]-1)*size;i <= b;i++)
15             arr[i] += c;
16     }
17     for(int i = block[a]+1;i < block[b];i++)
18         add[i] += c;
19 }
20
21 int main(){
22     scanf("%d",&n);
23     size = (int)sqrt(n);
24     for(int i = 0;i < n;i++) scanf("%d",&arr[i]);
25     for(int i = 0;i < n;i++) block[i] = i/size+1;
26 //    for(int i = 0;i < n;i++) printf("#%d: block->%d\n",i+1,block[i]);
27     scanf("%d",&q);
28     for(int i = 1;i <= q;i++){
29         scanf("%d",&swi);
30         if(swi%2){
31             scanf("%d%d%d",&a,&b,&c);
32 //            for(int i = 1;i <= n;i++) printf("#%d: add->%d\n",i,add[block[i]]);
33             modify(a,b,c);
34         }else{
35             scanf("%d",&a);
36             printf("%d\n",arr[a-1]+add[block[a-1]]);
37         }
38     }
39
40 //    for(int i = 0;i < n;i++) printf("#%d: block[%d]\n",i,block[i]);
41
42     return 0;
43 }

分块!

转载于:https://www.cnblogs.com/Chorolop/p/7512248.html

[Codevs] 1081 线段树练习 2 ----“分块!”相关推荐

  1. CodeVS 1081 线段树练习 2

    1081 线段树练习 2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作 1:给区间[a,b]的所 ...

  2. [Codevs] 1082 线段树练习3

    1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的 ...

  3. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  4. CODEVS.5037.线段树练习4加强版(分块 区间k的倍数)

    题目链接 /* 如果用线段树,每个节点要再开k的空间,显然不行.但是分块可以(虽然空间依旧爆炸)分块.用bloans[i][j]表示 第i块 模k为j 的有多少个 对于不是整块的,查询时应判断 A[i ...

  5. luo3372线段树模板的分块做法

    题目大意 请你维护一个有n个元素的整数序列,要求支持区间查询&区间修改 对于100%的数据,\(1<=n<=10^5\) 分析 正常做法是线段树维护区间修改.区间查询,今天我要讲的 ...

  6. Wikioi 1081 线段树成段更新单点查询

    线段树练习飘逸的写法,自从自己改成这样的写法之后,线段树就没再练过,如今最终练得上了. 由于这里查询仅仅是查询了叶子结点,所以pushUp函数就用不上了,只是我没去掉之前是3ms.去掉之后反而变成4m ...

  7. codevs 4927 线段树练习5 线段树基本操作模板

    4927 线段树练习5  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 有n个数和5种操作 add a b c:把区间[a,b ...

  8. codevs 3981 动态最大子段和(线段树)

    题目传送门:codevs 3981 动态最大子段和 题目描述 Description 题目还是简单一点好... 有n个数,a[1]到a[n]. 接下来q次查询,每次动态指定两个数l,r,求a[l]到a ...

  9. 线段树--codevs 1690 开关灯

    codevs 1690 开关灯 USACO  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题目描述 Description YYX家门前的街上有N(2& ...

最新文章

  1. C语言实现五子棋游戏(可N*N棋盘)
  2. oracle层次查询中prior与自上而下、自下而上查询
  3. 如何添加java环境变量_如何配置java环境变量
  4. C/C++获取系统当前时间
  5. android获取apk名称_安卓逆向——APK安装流程
  6. python打包成安装包_把 python 程序打包成 egg 或者 whl 安装包
  7. [css] 举例说明background-repeat的新属性值:round和space的作用是什么?
  8. mysql 模糊查询用法_mysql进阶(六)模糊查询的四种用法介绍
  9. 基于html的日历系统_企业信息化—APS系统(5)选型评估实战 Z 产品
  10. 加载本地json文件,并利用批处理调用Chrome显示html
  11. java tostring是什么意思_Java程序员不会用Lombok就落伍了
  12. php的链接查询,php – 使用指向另一个查询的链接运行查询.
  13. Javascript单例模式概念与实例
  14. html手机分辨率选择,怎么看手机分辨率(手机屏幕分辨率多少才合适?)
  15. Python如何判断某天是星期几
  16. stm32 负数_stm32中编码器模式读出“负数”的问题
  17. proftpd 530 Login incorrect
  18. oracle 客户端 sqlplus 命令行 问号 乱码
  19. 网络设备丢弃ECN包导致的慢响应问题
  20. 如何快速有效提升网站的百度排名

热门文章

  1. excel分段排序_学会这个神操作,报表填报不再五花八门,效率远超Excel
  2. Jackson高级操作————节点树
  3. C语言文件与数组之间输入输出操作
  4. 二进制法生成1-n的子集
  5. linux下载命令 scp,linux命令详解之scp命令
  6. python随机函数笔记_Python笔记__random
  7. selenium java po模式_selenium + java po模式
  8. KMP算法 串模式识别 用nextval[j]改进next[j]
  9. linuxpgrepgrep_linux命令:ps pstree pgrep pidof进程管理
  10. kpi绩效考核流程图_公开!松松团队KPI绩效考核表分享