树状数组-区间求和

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. ubuntu 14.04 安装tomcat服务器 配置图片路径和文件路径

    root@hett-PowerEdge-T30:/usr/local/src# lltotal 235956drwxr-xr-x  6 root root      4096  3月 26 14:48 ...

  2. 转向ARC的说明

    转自hherima的博客原文:Transitioning to ARC Release Notes(苹果官方文档) ARC是一个编译器特征,它提供了对OC对象自动管理内存.ARC让开发者专注于感兴趣的 ...

  3. CPP-基础:关于多态

        类的多态特性是支持面向对象的语言最主要的特性,有过非面向对象语言开发经历的人,通常对这一章节的内容会觉得不习惯,因为很多人错误的认为,支持类的封装的语言就是支持面向对象的,其实不然,Visua ...

  4. java在线聊天项目0.1版本 制作客户端窗体,使用swing(用户界面开发工具包)和awt(抽象窗口工具包)

    建立Chat项目,并在项目中创建窗口类 package com.swift; import java.awt.BorderLayout; import javax.swing.JFrame; impo ...

  5. 洛谷 P2032 扫描

    https://www.luogu.org/problemnew/show/P2032 为啥不用STL,多方便. 定义一个大根堆,里边放一对数,这个数的大小和位置. 我们对于每次查询,判断首元素的位置 ...

  6. 【图论 搜索】bzoj1064: [Noi2008]假面舞会

    做到最后发现还是读题比赛:不过还是很好的图论题的 Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选 ...

  7. (60)zabbix网络发现介绍Network Discovery

    网络发现简介 网络发现有什么用?网络发现怎么配置? 我们带着这两个问题开始我们的网络发现之旅. 比如小明有100台服务器,不想一台台主机去添加,能不能让zabbix自动添加主机呢,当然可以,网络发现便 ...

  8. Ubuntu 下的aegisub安装

    大家用开源的软件用习惯了.推荐大家使用一下字幕编辑软件 分享的是Ubuntu下的安装教程: $ sudo add-apt-repository ppa:djcj/aegisub $ sudo apt- ...

  9. vue中 表头th 合并单元格,且表格列数不定的动态渲染方法

    吐槽 今天,在vue中遇到 复杂表格的渲染 ,需要合并表头的单元格,且合并单元格的那列还是动态数据,也就是说你不知道会有多少组要合并起来,哎,我也有点说不清楚,废话不多说了,看代码把: 代码示例 da ...

  10. sed快速学习