模板 分块

分块模板
单点加 区间求和
时间复杂度 Q * sqrt(N)

 1 #include <bits/stdc++.h>
 2 #define For(i,j,k) for(int i=j;i<=k;i++)
 3 #define LL long long
 4 #define eps 1e-9
 5 using namespace std ;
 6
 7 const int N = 100011 ;
 8 int n,Q,size,cnt,pos,x ;
 9 LL ans ;
10 int a[N] ;
11 char s[2] ;
12 struct node{
13     LL sum ;
14 }tree[ 330 ];   //  sqrt
15
16 inline int read()
17 {
18     int x = 0 , f = 1 ;
19     char ch = getchar() ;
20     while(ch<‘0‘||ch>‘9‘) { if(ch==‘-‘) f = -1 ; ch = getchar(); }
21     while(ch>=‘0‘&&ch<=‘9‘) { x = x * 10+ch-48 ; ch = getchar(); }
22     return x * f ;
23 }
24
25 inline int what_cnt(int pos)        // 查询当前位置是属于哪一块中的
26 {
27     return (pos-1) / size + 1 ;
28 }
29
30 inline void build(int pos)        //  暴力重构一块
31 {
32     int L = (pos-1) * size+1 ;
33     int R = pos * size ;
34     LL sum = 0 ;
35     For(i,L,R) sum+=a[ i ] ;
36     tree[pos].sum = sum ;
37 }
38
39 inline LL query(int x,int y)
40 {
41     int L = what_cnt(x) ;
42     int R = what_cnt(y) ;
43     LL sum = 0 ;
44     if(L==R) {
45         For(i,x,y) sum+=a[ i ] ;           // 在同一块中要特殊处理
46         return sum ;
47     }
48     For(i,x,L*size) sum+=a[ i ] ;          //   加掉边沿的
49     For(i,(R-1)*size+1,y) sum+=a[ i ] ;
50     For(i,L+1,R-1) sum+=tree[ i ].sum ;
51     return sum ;
52 }
53
54 int main()
55 {
56     n = read() ; Q = read() ;
57     size = int(sqrt( n )+eps) ;
58     cnt = (n-1) / size+1 ;
59     //For(pos,1,cnt) build( pos ) ;
60
61     while(Q--) {
62         scanf("%s",s) ;
63         if(s[ 0 ]==‘x‘) {
64             x = read() ;
65             a[ x ]+=read() ;
66             pos = what_cnt( x ) ;
67             build( pos ) ;
68         }
69         else {
70             int L = read() ; int R = read() ;
71             ans = query(L,R) ;
72             printf("%lld\n",ans) ;
73         }
74      }
75     return 0 ;
76 }
时间: 2024-08-29 07:06:05

模板 分块的相关文章

洛谷1558 色板游戏 线段树

我先立个Flag 我,这几天,要过1W道线段树题. 题目背景 阿宝上学了,今天老师拿来了一块很长的涂色板. 题目描述 色板长度为L,L是一个正整数,所以我们可以均匀地将它划分成L块1厘米长的小方格.并从左到右标记为1, 2, ... L.现在色板上只有一个颜色,老师告诉阿宝在色板上只能做两件事:1. "C A B C" 指在A到 B 号方格中涂上颜色 C.2. "P A B" 指老师的提问:A到 B号方格中有几种颜色.学校的颜料盒中一共有 T 种颜料.为简便起见,我

vue学习之插槽

插槽 插槽(Slot)是Vue提出来的一个概念,正如名字一样,插槽用于决定将所携带的内容,插入到指定的某个位置,从而使模板分块,具有模块化的特质和更大的重用性. 个人理解:我感觉插槽就是父组件控制插槽的内容.他是用什么标签展示的,以及他要展示的内容.子组件来控制插槽插入的位置. 插槽的分类:插槽分为三种.匿名插槽,具名插槽,还有作用域插槽 匿名插槽:也就是默认插槽.把父组件中的内容默认插入到子组件的中<slot></slot>只的位置. 下面是展示在页面中的效果 具名插槽: 具名插

分块算法及模板

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置. 简要介绍 分块算法就是把一串数据分割成几块数据的算法,其实是对暴力的一种优化. 通常在分块时,每块的大小为√n.但最后一块的大小也可能小于√n,只能用暴力来算. 通过把对单个数据的操作转化为对几个块的数据的操作,能够节省时间,提高运算效率. 分块算法在处理大范围的修改.查询问题时有很大优势. 分块算法代码 1 /*此代码主要模仿了钟皓曦大佬的分块算法*/ 2 #include<iostream> 3 #include<cs

Luogu 2801 教主的魔法 | 分块模板题

Luogu 2801 教主的魔法 | 分块模板题 我犯的错误: 有一处l打成了1,还看不出来-- 缩小块大小De完bug后忘了把块大小改回去就提交--还以为自己一定能A了-- #include <cstdio> #include <cstring> #include <algorithm> #include <set> using namespace std; typedef long long ll; #define space putchar(' ')

教主的魔法(分块模板)

教主的魔法(luogu) Description 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不符合区间的书写规范,但我们可以认为是单独增加第L(R)个英雄的身高) CYZ.光哥和ZJQ等人不信教主的邪,于是他们有

luogu1903 【模板】分块/带修改莫队(数颜色)

莫队算法模板 推荐阅读这篇博客 #include <algorithm> #include <iostream> #include <cstdio> #include <cmath> using namespace std; int n, m, bse, blc[10005], a[10005], qCnt, cCnt, qwq[10005], ans=0; int cnt[10005]; char ss[5]; struct Query{ int xxx,

Luogu 1494 - 小Z的袜子 - [莫队算法模板题][分块]

题目链接:https://www.luogu.org/problemnew/show/P1494 题目描述 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把这N只袜子从1到N编号,然后从编号L到R(L 尽管小Z并不在意两只袜子是不是完整的一双,甚至不在意两只袜子是否一左一右,他却很在意袜子的颜色,毕竟穿两只不同色的袜子会很尴尬. 你的任务便是告诉小Z,他有多大的概率抽到两只颜

整除分块模板

这里大概讲解一下整除分块的原理和效果. 比如我们要求某个i的区间中,n/i的和是多少,但是其实你会发现,在一些连续的区间中,n/i是相等的,而整除分块的目的,便是按照n进行分块 使得可以跳过这些n/i是相等的这些区间,使得复杂度将到根号n for (int l=1,r;l<=n;l=r+1){ r=n/(n/l); // printf("%d ",r); } 原文地址:https://www.cnblogs.com/bluefly-hrbust/p/10600035.html

【模板】分块

两个操作,1是询问[l,r]颜色的数量,2是交换p,p+1位置的颜色. #include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; int n, m, a[600][50010], b[300010], block, l[600], r[600], pos[300010], c