• 分块6
  • 分块8
  • 分块9

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

分块6

支持插入一个数,询问一个位置上的数是多少.

/*
每块开一个vector,插入的时候先询问x指向的块和位置,然后插入就可以了;
询问的时候从第一个vector开始按顺序减去每一块的元素的个数,返回一个pair,first表示所在块,second表示块内的位置.
不要忘记如果某一块插入了很多数字要把所有块推倒重构.
快读快写把我坑死了.
*/
#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("")
/*By Citrus*/
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 bl(x) (((x)-1)/block+1)//Which block x belong
#define ls(x) (((x)-1)*block+1)//The left side of block x
#define rs(x) (min(n,(x)*block))//The right side of block xtypedef pair<int,int> pii;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
vector<int> v[yuzu|10];
int n,block,num,top;
fuko a,tmp;void buildblock()
{
re0 i;
block=sqrt(n),num=n/block+(n%block?1:0);
for (i=1;i<=n;++i) v[bl(i)].push_back(a[i]);
}pii query(int x)
{
int now=1;
for (;x>v[now].size();) x-=v[now++].size();
return pii(now,x-1);
}void push_down()//推倒重来
{
top=0;re0 i;
for (i=1;i<=num;v[i++].clear()) for (int j:v[i]) tmp[++top]=j;
int newblock=sqrt(top);num=top/newblock+(top%newblock?1:0);
for (i=1;i<=top;++i) v[bl(i)].push_back(tmp[i]);
}void insert(int pos,int x)
{
pii now=query(pos);
v[now.first].insert(v[now.first].begin()+now.second,x);
if (v[now.first].size()>20*block) push_down();
}int main()
{
re0 i;
scanf("%d",&n);
for (i=1;i<=n;++i) scanf("%d",&a[i]);
buildblock();
for (i=1;i<=n;++i){re0 op,l,r,c;scanf("%d%d%d%d",&op,&l,&r,&c);if (op){pii ans=query(r);printf("%d\n",v[ans.first][ans.second]);}else insert(l,r);}
}

分块8

区间查询等于c的数的个数,并同时将区间内的所有数改为c.
本题玄学就在于查询的同时进行了修改.
如果查询与修改分开,这题分块就过不了了.

/*
我们来看均摊的复杂度.
对于查询和修改,被修改成同一个数字的可以打上标记.
这样被修改的只有头尾两块.
如果你想让一次查询是O(n)的,必须要先用O(sqrt(n))的复杂度的修改去修改每一块,把所有的标记都破坏掉.
所以复杂度是O(sqrt(n))的.
但是如果查询和修改是分开的,每次只修改一个块内的数,然后查询[1,n],就炸了.
当然这题还是有非常多细节要注意的.
当被打上标记的块被l或者r断开了,必须要把标记下推.
我debug了好久,最后竟然A掉了.
*/
#pragma GCC optimize("inline,Ofast",3)
#include<bits/stdc++.h> //Ithea Myse Valgulious
#define yuri puts("niconiconi")
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("")
/*By Citrus*/
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 bl(x) (((x)-1)/block+1)
#define ls(x) (((x)-1)*block+1)
#define rs(x) (min(n,(x)*block))
const int yuzu=1e5;
typedef int fuko[yuzu|10];
fuko a,tag;int n,block,num;void buildblock()//³õʼ»¯block
{
re0 i;
block=sqrt(n),num=n/block+(n%block?1:0);
}void debug()
{
re0 i;
for (i=1;i<=n;++i) printf("%d ",a[i]);pl;
for (i=1;i<=num;++i) printf("%d ",tag[i]);pl;
}void push_down(int x)//标记下推(就是线段树的延迟标记),其实就是暴力修改,然后把标记清零.
{
if (tag[x])for (re0 i=ls(x);i<=rs(x);++i) a[i]=tag[x];
}int query(int l,int r,int c)
{
re0 i,ans=0;
push_down(bl(l));
for (i=l;i<=min(r,rs(bl(l)));++i)ans+=a[i]==c;//暴力
if (bl(r)!=bl(l))//暴力{push_down(bl(r));for (i=ls(bl(r));i<=r;++i) ans+=a[i]==c; }
for (i=bl(l)+1;i<bl(r);++i) {if (!tag[i]) //没有标记,暴力 for (re0 j=ls(i);j<=rs(i);++j) ans+=a[j]==c;else ans+=tag[i]==c?rs(i)-ls(i)+1:0;//有标记,O(1)回答. }
return ans;
}void update(int l,int r,int c)
{
re0 i;
push_down(bl(l));
for (i=l;i<=min(r,rs(bl(l)));++i)a[i]=c;//暴力
tag[bl(l)]=0;
if (bl(r)!=bl(l)){push_down(bl(r));for (i=ls(bl(r));i<=r;++i) a[i]=c;//暴力tag[bl(r)]=0;}
for (i=bl(l)+1;i<bl(r);++i)//打标记tag[i]=c;
}int main()
{
int i;
scanf("%d",&n);
for (i=1;i<=n;++i) scanf("%d",&a[i]);
buildblock();
for (i=1;i<=n;++i) {re0 l,r,c;scanf("%d%d%d",&l,&r,&c);printf("%d\n",query(l,r,c));update(l,r,c);//debug();}
}

分块9

询问区间最小众数.
这题只有询问,看似简单,实则也不简单.
洛谷上有p4168蒲公英,双倍经验了解一下.
以下不是分块9的代码,是蒲公英的.
lojAC代码里可以看到我的.

/*
我们先把这些数离散化一下,然后预处理.
预处理要处理两个玩意.
第一个是[l,r]内有多少个数x.
第二个是块[l,r]内的众数是多少.
第一个O(n),第二个O(n*sqrt(n)).
询问的时候先把ans处理成[belong(l)+1,belong(r)-1]块内的众数.
然后把l,r所在的部分遍历一下,与答案比较.
*/
#include<bits/stdc++.h> //Ithea Myse Valgulious
#define yuri puts("niconiconi")
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("")
/*By Citrus*/
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);}
inline char fuhao(){rec c=gc();for (;isspace(c);c=gc());return c;}
}using namespace chtholly;
using namespace std;
#define bl(x) (((x)-1)/block+1)
#define ls(x) (((x)-1)*block+1)
#define rs(x) (min((x)*block,n))
const int yuzu=1e5;
typedef int fuko[yuzu|10];
#define all(x) x.begin(),x.end()
int n=read(),m=read(),block,num,sum[1500][1500];
vector<int> pos[yuzu|10];
fuko a,b,cnt;int query(int l,int r,int x){return upper_bound(all(pos[x]),r)-lower_bound(all(pos[x]),l);}//询问[l,r]内x有多少个.void buildblock(){
re0 i;
block=sqrt(n/log2(n));
sort(b+1,b+n+1);
num=unique(b+1,b+n+1)-b-1;
for (i=1;i<=n;++i) {a[i]=lower_bound(b+1,b+num+1,a[i])-b;//离散化并预处理每一个数出现的位置pos[a[i]].push_back(i);}
for (i=1;i<=bl(n);++i){//预处理区间[i,j]的众数memset(cnt,0,sizeof cnt);int ans=0;for (re0 j=ls(i);j<=n;++j){cnt[a[j]]++;if (cnt[a[j]]>cnt[ans]||cnt[a[j]]==cnt[ans]&&a[j]<ans) ans=a[j];sum[i][bl(j)]=ans;}}
}int main(){
re0 i,t;
for (i=1;i<=n;++i) a[i]=b[i]=read();
buildblock();
int lastans=0;
for (t=1;t<=m;++t){int l=read(),r=read(),ans,tmp;l=(l+lastans-1)%n+1,r=(r+lastans-1)%n+1;if (l>r) swap(l,r);ans=sum[bl(l)+1][bl(r)-1],tmp=query(l,r,ans);for (i=l;i<=min(rs(bl(l)),r);++i){int t=query(l,r,a[i]);if (t>tmp||t==tmp&&a[i]<ans) ans=a[i],tmp=t;/*如果a[i]出现的次数大于已有的众数,或者出现次数相等但是a[i]比已知众数小的话就用a[i]更新ans.*/}if (bl(l)!=bl(r)){for (i=ls(bl(r));i<=r;++i){int t=query(l,r,a[i]);if (t>tmp||t==tmp&&a[i]<ans) ans=a[i],tmp=t;}}write(b[ans]),pl;lastans=b[ans];}
}

Thank you.Yeah!

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

  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. LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.

    分块1 分块2 分块4 模板一共有九个.我试着在三天内做了3个. 应该不用超链接吧. 分块1 区间加,单点询问. 这不是裸的改版树状数组吗?用树状数组处理前缀和水过. #include<bits ...

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

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

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

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

  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. 仅凭一部iPhone手机,打造现实版元宇宙
  2. php js统计链接点击次数,JS实现在线统计一个页面内鼠标点击次数的方法
  3. 编译-C++支持iOS静态库的脚本学习
  4. java 中调用window系统中的文件,或者执行命令(shell、.CMD、.EXE)并获取返回值
  5. 如何将usb摄像头连接到虚拟机vmware ubuntu系统上?
  6. Kafka 1.0版本发布
  7. zabbix3监控ESXI主机
  8. maven jar包下载
  9. 连续与离散变量的函数分布计算
  10. 使用cordova,使html5也能像IOS,Android那样可以 调取手机的相机拍照功能
  11. Mac 录屏制作gif动图
  12. 【算法工程师】华为技术面面试记录
  13. python绘制正态分布图_在python中画正态分布图像的实例
  14. 手把手教你使用R语言做出SCI论文中的表二(单因素分析表)(1)
  15. 什么时候,董明珠能成功卖给记者一部格力手机?
  16. Android跳转-ARouter详细使用教程
  17. 【JAVA长虹键法】第八式 代理模式(23种设计模式)
  18. oracle 重建控制文件 恢复数据库
  19. 小米10开始抓取日志怎么关闭_「教程」快来查查你的小米10是三星屏还是华星光电屏...
  20. 大专生学云计算,工作好找吗?

热门文章

  1. 智能电表实现远程抄表,剔除人工抄表的弊端!
  2. 谷歌大脑的-Swish-激活函数与-ReLU-激活函数对比
  3. 超全的Python完全版电子书 pdf,从基础到爬虫、分析等高级应用
  4. 国家电网公司跨区电网直流工程成套设计工作管理办法》
  5. h5调用手机相机和录音机_奥林巴斯结束相机业务!专注医疗领域
  6. 用户画像修炼笔记--GIAC参会小纪
  7. 贫穷可耻、贫穷有罪吗?
  8. 20221130 RabbitMQ
  9. 东华软件测试题,东华大学软件测试作业整理.docx
  10. 怎么用106短信平台来发送营销短信?手把手教你轻松掌握