洛谷试炼场 提高模板-nlogn数据结构
树状数组-区间求和
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数据结构的更多相关文章
- 洛谷 P3370 【模板】字符串哈希
洛谷 P3370 [模板]字符串哈希 题目描述 如题,给定N个字符串(第i个字符串长度为Mi,字符串内包含数字.大小写字母,大小写敏感),请求出N个字符串中共有多少个不同的字符串. 友情提醒:如果真的 ...
- 洛谷P3369 【模板】普通平衡树(Treap/SBT)
洛谷P3369 [模板]普通平衡树(Treap/SBT) 平衡树,一种其妙的数据结构 题目传送门 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除 ...
- 洛谷试炼场-简单数学问题-P1045 麦森数-高精度快速幂
洛谷试炼场-简单数学问题 B--P1045 麦森数 Description 形如2^P−1的素数称为麦森数,这时P一定也是个素数.但反过来不一定,即如果PP是个素数,2^P-1 不一定也是素数.到19 ...
- 洛谷P3366【模板】最小生成树-克鲁斯卡尔Kruskal算法详解附赠习题
链接 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包含两个整数N.M,表示该图共有N个结点和M条无向边.(N<=5000,M&l ...
- 洛谷 P3377 【模板】左偏树(可并堆)
洛谷 P3377 [模板]左偏树(可并堆) 题目描述 如题,一开始有N个小根堆,每个堆包含且仅包含一个数.接下来需要支持两种操作: 操作1: 1 x y 将第x个数和第y个数所在的小根堆合并(若第x或 ...
- 洛谷P1919 【模板】A*B Problem升级版 题解(FFT的第一次实战)
洛谷P1919 [模板]A*B Problem升级版(FFT快速傅里叶) 刚学了FFT,我们来刷一道模板题. 题目描述 给定两个长度为 n 的两个十进制数,求它们的乘积. n<=100000 如 ...
- 洛谷 P1439 【模板】最长公共子序列
\[传送门啦\] 题目描述 给出\(1-n\)的两个排列\(P1\)和\(P2\),求它们的最长公共子序列. 输入输出格式 输入格式: 第一行是一个数\(n\), 接下来两行,每行为\(n\)个数,为 ...
- 洛谷 P1226 【模板】快速幂||取余运算
题目链接 https://www.luogu.org/problemnew/show/P1226 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 ...
- FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
随机推荐
- 9.18 New Start
好久没上cnblogs,今天提示我说园龄已经2年1个月了.今天就用一个日记的形式开始第一篇博客吧.我以后比较精髓的文章就放在cnblogs,csdn博客也继续会更新,不过也会慢慢提高文章质量. 今天是 ...
- ABC3D创客项目:国旗
国旗是一个国家的象征,也是一个民族的骄傲,国旗带给人们的不仅是荣耀,更多的是爱国的情结.看一场天安门的升旗仪式一度成为广大游客去到北京的必有项目,看国旗仪仗队将五星红旗与太阳同时升起,象征着我国充满活 ...
- docker安装Tensorflow并使用jupyter notebook
目前网上提供的大多数的方法都是如下: docker pull tensorflow/tensorflow docker run -it -p : tensorflow/tensorflow 但是按照步 ...
- 树形dp——覆盖所有边的最少费用(Protecting Zonk)
一.问题描述 有一个n(n<=10000)个节点的无根树.有两种装置A,B,每种都有无限多个. 1.在某个节点X使用A装置需要C1(C1<=1000)的花费,并且此时与节点X相连的边都被覆 ...
- robotframework接口测试实例
*** Settings *** Library Collections Library RequestsLibrary *** Test Cases *** test Create Session ...
- 本地开发环境中部署已经写好的magento2.0项目
环境:apache2.4.25+php7.0.16+mysql5.7 (注意版本搭配,详细可以看magento2.0官网看配置) apache最好使用80端口,host文件配置本地虚拟域名 php.i ...
- PyCharm(一)——PyCharm设置SSH远程调试
一.环境 系统环境:windows10 64位 软件:PyCharm2017.3 本地Python环境:Python2.7 二.配置 2.1配置远程调试 第一步:运行PyCharm,然后点击设置如下图 ...
- 数据结构( Pyhon 语言描述 ) — —第9章:列表
概念 列表是一个线性的集合,允许用户在任意位置插入.删除.访问和替换元素 使用列表 基于索引的操作 基本操作 数组与列表的区别 数组是一种具体的数据结构,拥有基于单个的物理内存块的一种特定的,不变的实 ...
- [转]Makefile中的wildcard/notdir/patsubst
1.wildcard : 扩展通配符 2.notdir : 去除路径 3.patsubst :替换通配符 例子:建立一个测试目录,在测试目录下建立一个名为sub的子目录$ mkdir test$ cd ...
- LeetCode(91) Decode Ways
题目 A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A ...