树状数组-区间求和

P3374 【模板】树状数组 1

 /*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int mxn=;
int n,m;
int t[mxn];
void add(int x,int v){
while(x<mxn){t[x]+=v;x+=x&-x;}
}
int smm(int x){
int res=;
while(x){
res+=t[x];
x-=x&-x;
}
return res;
}
int main(){
int op,x,k;
n=read();m=read();
int i,j;
for(i=;i<=n;i++){
x=read();
add(i,x);
}
for(i=;i<=m;i++){
op=read();x=read();k=read();
if(op==){
add(x,k);
}
else{
printf("%d\n",smm(k)-smm(x-));
}
}
return ;
}

树状数组1

树状数组-差分

P3368 【模板】树状数组 2

 /*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
const int mxn=;
int n,m;
int t[mxn];
void add(int x,int v){
while(x<mxn){t[x]+=v;x+=x&-x;}
}
int smm(int x){
int res=;
while(x){
res+=t[x];
x-=x&-x;
}
return res;
}
int main(){
int op,x,k;
n=read();m=read();
int i,j;
for(i=;i<=n;i++){
x=read();
add(i,x);
add(i+,-x);
}
for(i=;i<=m;i++){
op=read();
if(op==){
x=read();k=read();op=read();
add(x,op);
add(k+,-op);
}
else{
x=read();
printf("%d\n",smm(x));
}
}
return ;
}

树状数组2

线段树-区间加 区间乘

P3373 【模板】线段树 2

 /*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
#define ls l,mid,rt<<1
#define rs mid+1,r,rt<<1|1
#define lc rt<<1
#define rc rt<<1|1
using namespace std;
const int mxn=;
long long n,p;
long long a[mxn];
struct node{
long long sum;
long long mu;
long long add;
}tr[mxn];
void pushdown(int rt,int m){
tr[lc].sum=(tr[lc].sum*tr[rt].mu+(m-(m>>))*tr[rt].add)%p;
//m-(m>>1)得到区间范围的一半,也就是左子树的范围
tr[rc].sum=(tr[rc].sum*tr[rt].mu+(m>>)*tr[rt].add)%p;
tr[lc].mu=tr[lc].mu*tr[rt].mu%p;
tr[rc].mu=tr[rc].mu*tr[rt].mu%p;
tr[lc].add=(tr[lc].add*tr[rt].mu+tr[rt].add)%p;
tr[rc].add=(tr[rc].add*tr[rt].mu+tr[rt].add)%p;
tr[rt].mu=;tr[rt].add=;
return;
}
void Build(int l,int r,int rt){
tr[rt].mu=;tr[rt].add=;
if(l==r){
tr[rt].sum=a[l];
return;
}
int mid=(l+r)>>;
Build(ls);
Build(rs);
tr[rt].sum=(tr[rt<<].sum+tr[rt<<|].sum)%p;
return;
}
void add(int L,int R,int l,int r,int rt,int v){
if(L<=l && r<=R){
tr[rt].sum=(tr[rt].sum+v*(r-l+))%p;//本身值累加区间新增值
tr[rt].add=(tr[rt].add+v)%p;//标记累加
return;
}
pushdown(rt,r-l+);//下传
int mid=(l+r)>>;
if(L<=mid)add(L,R,ls,v);
if(R>mid)add(L,R,rs,v);
tr[rt].sum=(tr[lc].sum+tr[rc].sum)%p;
return;
}
void multi(int L,int R,int l,int r,int rt,int v){
if(L<=l && r<=R){
tr[rt].add=(tr[rt].add*v)%p;
tr[rt].mu=(tr[rt].mu*v)%p;
tr[rt].sum=(tr[rt].sum*v)%p;
return;
}
pushdown(rt,r-l+);
int mid=(l+r)>>;
if(L<=mid)multi(L,R,ls,v);
if(R>mid)multi(L,R,rs,v);
tr[rt].sum=(tr[lc].sum+tr[rc].sum)%p;
return;
}
long long query(int L,int R,int l,int r,int rt){//查询
if(L<=l && r<=R)return tr[rt].sum%p;
int mid=(l+r)>>;
pushdown(rt,r-l+);
long long res=;
if(L<=mid)res=(res+query(L,R,ls))%p;
if(R>mid)res=(res+query(L,R,rs))%p;
tr[rt].sum=(tr[lc].sum+tr[rc].sum)%p;
return res%p;
}
int main(){
int M;
scanf("%lld%lld%lld",&n,&M,&p);
int i,j;
for(i=;i<=n;i++)scanf("%lld",&a[i]);
Build(,n,);
int op,g,t,c;
while(M--){
scanf("%d%d%d",&op,&t,&g);
if(op==){//乘
scanf("%d",&c);
multi(t,g,,n,,c);
}
if(op==){//加
scanf("%d",&c);
add(t,g,,n,,c);
}
if(op==){//询问
long long ans=query(t,g,,n,);
printf("%lld\n",ans%p);
}
}
return ;
}

线段树区间修改

二叉堆

P3378 【模板】堆

 /*by SilverN*/
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
const int mxn=;
int read(){
int x=,f=;char ch=getchar();
while(ch<'' || ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>='' && ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
}
int tp[mxn];
int cnt=;
void add(int x){
tp[++cnt]=x;
int now=cnt;
while(now>){
int nxt=now/;
if(tp[nxt]<=tp[now])return;
swap(tp[nxt],tp[now]);
now=nxt;
}
return;
}
int del_head(){
int res=tp[];
tp[]=tp[cnt--];
int now=;
while(now<=cnt/){
int nxt=now<<;
if(nxt<cnt && tp[nxt+]<tp[nxt])nxt++;
if(tp[now]>tp[nxt]){
swap(tp[now],tp[nxt]);
now=nxt;
}
else return res;
}
return res;
}
int main(){
int n;
n=read();
int op,x,y;
int i,j;
for(i=;i<=n;i++){
op=read();
switch(op){
case :{x=read();add(x);break;}
case :{printf("%d\n",tp[]);break;}
case :{del_head();break;}
}
}
return ;
}

最小堆

此处是最小堆

洛谷试炼场 提高模板-nlogn数据结构的更多相关文章

  1. 洛谷 P3370 【模板】字符串哈希

    洛谷 P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的 ...

  2. 洛谷P3369 【模板】普通平衡树(Treap/SBT)

    洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...

  3. 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂

    洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...

  4. 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题

    链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...

  5. 洛谷 P3377 【模板】左偏树(可并堆)

    洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...

  6. 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)

    洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...

  7. 洛谷 P1439 【模板】最长公共子序列

    \[传送门啦\] 题目描述 给出\(1-n\)的两个排列\(P1\)和\(P2\),求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数\(n\), 接下来两行,每行为\(n\)个数,为 ...

  8. 洛谷 P1226 【模板】快速幂||取余运算

    题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...

  9. FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)

    前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...

随机推荐

  1. iterator与iterable

    用Iterator模式实现遍历集合Iterator模式是用于遍历集合类的标准访问方法.它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构.例如,如果没有使用Iterato ...

  2. 转过来的Xpath语法

    XPath 是XML的查询语言,和SQL的角色很类似.以下面XML为例,介绍XPath 的语法.   <?xml version="1.0" encoding="I ...

  3. vue引用文件

    1)css引入在vue页面中<style scoped> @import url("../assets/css/home.css");</style>2)j ...

  4. 单机简单搭建一个kafka集群(没有进行内核参数和JVM的调优)

    1.JDK安装 在我的部署单节点kafka的博客里有相关的方法.(https://www.cnblogs.com/ToBeExpert/p/9789486.html )zookeeper和kafka的 ...

  5. 【tarjan 拓扑排序 dp】bzoj1093: [ZJOI2007]最大半连通子图

    思维难度不大,关键考代码实现能力.一些细节还是很妙的. Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于 ...

  6. [LUOGU] P1024 选课

    题目描述 在大学里每个学生,为了达到一定的学分,必须从很多课程里选择一些课程来学习,在课程里有些课程必须在某些课程之前学习,如高等数学总是在其它课程之前学习.现在有N门功课,每门课有个学分,每门课有一 ...

  7. 【Java_基础】cmd下使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析

    1.问题如下 当在命令行使用java命令执行字节码文件时提示“错误:找不到或无法加载主类” 2. 问题分析 这是由于在运行时类的全名应该是包名+类名,例如在包net.xsoftlab.baike下的类 ...

  8. tkinter学习-文本框

    阅读目录 Entry 输入框 Text 文本框 Entry: 说明:输入控件,用于显示简单的文本内容 属性:在输入框中用代码添加和删除内容,同样也是用insert()和delete()方法 from ...

  9. 快照、克隆,xshell优化,Linux历史

    目录 一.虚拟拍照功能 二.虚拟机克隆功能 三.Xshell的优化 四.介绍Linux历史 一.虚拟拍照功能 1.拍摄快照 关机状态拍照 关机命令:shutdown -h now 或者 init 0 ...

  10. Flask 系列之 构建 Swagger UI 风格的 WebAPI

    说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验 环境初始化 # 创建项目目录 mkdir helloworl ...