• 分块1
  • 分块2
  • 分块4

模板一共有九个.我试着在三天内做了3个.
应该不用超链接吧.

分块1

区间加,单点询问.
这不是裸的改版树状数组吗?用树状数组处理前缀和水过.

#include<bits/stdc++.h>
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
inline int read(){re0 x=0,f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';return x*(f?1:-1);}
inline void read(rel &x){x=0;re0 f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';x*=f?1:-1;}
inline int write(rel x){if (!x) return pc(48);if (x<0) x=-x,pc('-');re0 bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);}
}
using namespace chtholly;
using namespace std;
#define lowbit(x) (x&-x)
const int karen=5e5;
int n=read();
ll a[karen|10],c[karen|10];
inline void add(int x,int k){for (;x<=n;x+=lowbit(x)) c[x]+=k;}
inline int query(int x){int sum=0;for (;x>0;x-=lowbit(x)) sum+=c[x];return sum;}int main()
{
re0 i;
for (i=1;i<=n;++i) a[i]=read();
for (i=1;i<=n;++i){re0 k=read(),x=read(),y=read(),z=read();if (!k) add(x,z),add(y+1,-z);else write(a[y]+query(y)),pl;}
}

分块2

区间加,区间查询小于c^2的数的个数.
好题.线段树是搞不定的,考虑玄学分块.
数组开了5e4,莫名RE30分.我开成了1e5,A掉了.我不知道怎么回事.

/*
分块处理.
对于修改,左右两个不包含整块的部分,我们就暴力修改并重构整个块.
中间的整块的部分我们维护一个延迟标记,询问的时候减去标记即可.
至于询问,左右两个部分暴力扫一下,中间对每一块进行二分求出答案.
我写的分块实在丑了点.
*/
#include<bits/stdc++.h> //Ithea Myse Valgulious
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
inline int read(){re0 x=0,f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';return x*(f?1:-1);}
inline void read(rel &x){x=0;re0 f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';x*=f?1:-1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return pc(48);if (x<0) x=-x,pc('-');re0 bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);}
}
using namespace chtholly;
using namespace std;
#define belong(x) (((x)-1)/block+1)//这个位置所属的块.
#define all(u) v[u].begin(),v[u].end()
const int karen=1e5;
typedef int fuko[karen|10];//定义了fuko类型是大小为karen+10的数组.
fuko a,l,r,lazy;
int n=read(),block,num;
vector<int> v[karen|10];
/*
block是每一块的大小,num是一共的块数.
l,r分别是每一块的左边界和右边界,belong是每一个位置所属的块.
lazy是给某一块的所有数加上的值.(询问的时候用c减去就可以了.)
*/void buildblock()//预处理每个块的信息.
{
re0 i;
block=sqrt(n),num=n/block+n%block;
for (i=1;i<=num;++i) l[i]=(i-1)*block+1,r[i]=i*block;r[num]=n;//处理每个块的左边界和右边界.注意特判最后一块的右边界是n.
for (i=1;i<=n;++i) v[belong(i)].push_back(a[i]);//vector从小到大存放每一个块内的数.
for (i=1;i<=num;++i) sort(all(i));
}void readd(int x)//直接重构块.
{
v[x].clear();
for (re0 i=l[x];i<=r[x];++i)v[x].push_back(a[i]);
sort(all(x));
}void update(int ql,int qr,int k)//区间修改.
{
re0 i;
for (i=ql;i<=min(r[belong(ql)],qr);++i)//暴力扫从l到它所在块右边界的部分.a[i]+=k;
readd(belong(ql));
if (belong(ql)!=belong(qr))//如果l和r不在同一块内,处理r所在的部分.{for (i=l[belong(qr)];i<=qr;++i)a[i]+=k;readd(belong(qr));}
for (i=belong(ql)+1;i<belong(qr);++i) lazy[i]+=k;//处理一下延迟标记.
}int query(int ql,int qr,int c)
{
re0 ans=0,i;
for (i=ql;i<=min(qr,r[belong(ql)]);++i)ans+=a[i]+lazy[belong(i)]<c;//暴力
if (belong(ql)!=belong(qr)) {for (i=l[belong(qr)];i<=qr;++i) ans+=a[i]+lazy[belong(i)]<c;//暴力}
for (i=belong(ql)+1;i<belong(qr);++i)ans+=lower_bound(all(i),c-lazy[i])-v[i].begin();//二分求每一个块的答案.
return ans;
}int main()
{
re0 i;
for (i=1;i<=n;++i) a[i]=read();
buildblock();
for (i=1;i<=n;++i){re0 op=read(),l=read(),r=read(),k=read();if (op) write(query(l,r,k*k)),pl;else update(l,r,k);}
}

分块4

区间加,区间求和.
这个显然是线段树,不用说了.

#include<bits/stdc++.h>
namespace chtholly{
typedef long long ll;
#define re0 register int
#define rec register char
#define rel register ll
#define gc getchar
#define pc putchar
#define p32 pc(' ')
#define pl puts("")
inline int read(){re0 x=0,f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';return x*(f?1:-1);}
inline void read(rel &x){x=0;re0 f=1;rec c=gc();for (;!isdigit(c);c=gc()) f^=c=='-';for (;isdigit(c);c=gc()) x=x*10+c-'0';x*=f?1:-1;}
template <typename mitsuha>
inline int write(mitsuha x){if (!x) return pc(48);if (x<0) x=-x,pc('-');re0 bit[20],i,p=0;for (;x;x/=10) bit[++p]=x%10;for (i=p;i;--i) pc(bit[i]+48);}
}
using namespace chtholly;
using namespace std;
const int karen=5e4;
typedef ll fuko[karen<<2];
int n=read();struct segtree{
#define le rt<<1
#define ri le|1
#define ls le,l,mid
#define rs ri,mid+1,r
fuko val,lazy;
void build(int rt,int l,int r){if (l==r) val[rt]=read();else{int mid=l+r>>1;build(ls),build(rs);val[rt]=val[le]+val[ri];}}
void push_down(int rt,int l,int r){if (lazy[rt]){int mid=l+r>>1;lazy[le]+=lazy[rt],lazy[ri]+=lazy[rt];val[le]+=(mid-l+1)*lazy[rt],val[ri]+=(r-mid)*lazy[rt];lazy[rt]=0;}}
void update(int rt,int l,int r,int ql,int qr,int v){if (ql>r||qr<l) return;if (ql<=l&&qr>=r){val[rt]+=1ll*(r-l+1)*v;lazy[rt]+=v;} else{int mid=l+r>>1;push_down(rt,l,r);update(ls,ql,qr,v),update(rs,ql,qr,v);val[rt]=val[le]+val[ri];}}
ll query(int rt,int l,int r,int ql,int qr){if (ql>r||qr<l) return 0;if (ql<=l&&qr>=r) return val[rt];int mid=l+r>>1;push_down(rt,l,r);return query(ls,ql,qr)+query(rs,ql,qr);}
}my_;int main()
{
my_.build(1,1,n);
for (re0 i=1;i<=n;++i){re0 t=read(),l=read(),r=read(),k=read();if (t) write((my_.query(1,1,n,l,r)%(k+1)+k+1)%(k+1)),pl;else my_.update(1,1,n,l,r,k);}
}

Thank you.

LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.相关推荐

  1. 树状数组、线段树、分块 在同一题目中的应用(Acwing 243)

    Acwing 243 输入样例: 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 输出样例: 4 55 9 15 树状数组做法 # ...

  2. 树状数组及线段树入门(SDNU1665-1668)

    目录 前言 树状数组 先导 单点修改区间查询 区间修改区间查询 线段树 先导 单点修改区间查询--递归形式 单点修改区间查询--非递归形式 区间修改区间查询--递归形式 区间修改区间查询--非递归形式 ...

  3. 牛客23054 华华开始学信息学 树状数组分块

    题目链接:牛客23054 华华开始学信息学 题目描述 因为上次在月月面前丢人了,所以华华决定开始学信息学.十分钟后,他就开始学树状数组了.这是一道树状数组的入门题: 给定一个长度为N的序列A,所有元素 ...

  4. POJ3468-A Simple Problem with Integers【线段树,树状数组,分块】

    正题 题目链接:我是链接 其实洛谷线段树模板也是一样的:三种方法AC评测链接 题目大意 要求支持区间修改,区间求和. 线段树 直接用一个lazy标记,在之前的博客里有说 code1 #include& ...

  5. LibreOJ 6282,6284,6285 数列分块入门6,8,9 树状数组,分块,线段树等.

    分块6 分块8 分块9 终于结尾了. 诶?我定义的常量变成yuzu了?我不要可怜了? 可怜有剧毒!我再用可怜我要爆零了. 好吧其实是因为我研究了橘学.这里我推荐一下Citrus. 分块6 支持插入一个 ...

  6. ACM入门之【树状数组】

    树状数组和线段树具有相似的功能,但他俩毕竟还有一些区别:树状数组能有的操作,线段树一定有:线段树有的操作, 树状数组不一定有.但是树状数组的代码要比线段树短,思维更清晰,速度也更快,在解决一些单点修改 ...

  7. 20220725树状数组入门反思

    最近学习了树状数组和线段树,图论一点点啃吧,然后首先介绍一下树状数组的原理: 借用acwing一老哥的题解了. 树状数组的本质思想是使用树结构维护"前缀和",从而把时间复杂度降为O ...

  8. 小魂和他的数列(dp+树状数组优化)

    链接:https://ac.nowcoder.com/acm/contest/3566/C 来源:牛客网 Sometimes, even if you know how something's goi ...

  9. 牛客小白月赛12 F 华华开始学信息学 (分块+树状数组)

    链接:https://ac.nowcoder.com/acm/contest/392/F 来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 32768K,其他语言65536 ...

最新文章

  1. java 获取聚合vo_NC57聚合VO写法
  2. ASP.NET页面通过URL传递参数(一)(转载)
  3. L2-001 紧急救援-团体程序设计天梯赛GPLT
  4. 字符串转16进制字节数组,字节数组转16进制字符串
  5. 【BZOJ】【1086】 【SCOI2005】王室联邦
  6. Tips for vcpkg
  7. 如何使textarea显示滚动条
  8. 美国国家人工智能研发战略规划2019
  9. 十三、Linux驱动之触摸屏驱动
  10. Java医院网上预约挂号系统源码
  11. 手机数据网络慢怎么修改服务器,手机网速慢怎么回事 这三种方法可以一试
  12. Navicat Premium 用于增强您的数据库管理系统
  13. 计算机网络人工智能论文,浅析计算机网络中人工智能的应用论文
  14. 嵌入式软件学习问题汇总(一)什么是嵌入式?
  15. ubuntu终端字体大小调整方法
  16. 怎样将表格拆分为两个
  17. MII与RMII接口的区别
  18. js IP地址正则校验
  19. WPF 触发器Triggers
  20. DSP关键字cregister (关于IER,IFR找不到定义)

热门文章

  1. python ffmpeg模块mp4岀错_Python 调用 FFmpeg 提示 module 'ffmpeg' has no attribute 'input' 的解决方法-老唐笔记...
  2. 网件路由器R6400 梅林固件折腾篇
  3. 查看linux驱动使用的头文件,[转载]linux下usb驱动头文件的usb.h(二)
  4. Unity为物体施加力笔记
  5. 汇编语言复习题及详细答案1(老师给的题 自己写的答案)
  6. 赛迪研究院发布《2019中国大数据产业发展白皮书》
  7. 知识图谱学习与实践(6)——从结构化数据进行知识抽取(D2RQ介绍)
  8. 说好的30天直播生死呢?--第三章 我所理解的打击感(一)
  9. Unity3D 场景切换异步加载进度
  10. vue 错误building 2/2 modules 0 activeevents.js: 187 throw er; // unhandled 'error' event..... 解决