洛谷试炼场 提高模板-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)
前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...
随机推荐
- Codeforces Round #317 (Div. 2) C Lengthening Sticks (组合,数学)
一个合法的三角形的充要条件是a<b+c,其中a为最长的一边,可以考虑找出所有不满足的情况然后用总方案减去不合法的情况. 对于一个给定的总长度tl(一定要分完,因为是枚举tl,不分配的长度已经考虑 ...
- jquery操作滚动条滚动到指定元素位置 scrollTop
$('.brand_t a').bind('click',function(){ if($(this).attr('title1')){ var toChar = $(this).attr('titl ...
- jQuery实现滚动条下拉时无限加载
var lastId=0;//记录每一次加载时的最后一条记录id,跟您的排序方式有关. var isloading = false; $(window).bind("scroll" ...
- js最高效的数组去重方法
var arr=[1,2,33,2,4,5,33,5,7,8,1,3];var result=[];var temp={};for( var i=0;i<arr.length;i++){ if( ...
- CF-1110 (2019/02/08)
CF-1110 A. Parity 快速幂的思想,考虑最后一位即可 #include <bits/stdc++.h> using namespace std; typedef long l ...
- Watch Before You Feel Pressure
Today's assembly is about the start of a journey. 今天的大会是一个旅程的开始. The start of the rest of your lives ...
- 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card
巧妙的贪心 Description Bessie the cow is a huge fan of card games, which is quite surprising, given her l ...
- centOS下SVN安装和配置
1>SVN服务器端文件可见问题 在平时使用SVN时候,一直以为在客户提交文件,那么在服务器对应的版本库下面就会有相同文件.在自己搭建后,发现提交到服务器端文件完全看不见.... 这是由于SVN服 ...
- perl学习一:探索Perl世界
1.perl4种变量 scalar: $ 纯变量,标量array: @hash: %file: 大写 2.变量组成 1.命名规则 大小写敏感 . 字母数字下划线...2.无关键字,$+其他,但不可以与 ...
- STM32L0开发——ADC多通道采集,IDE和IAR开发注意事项
keil开发L0系列是免费的,官方提供许可的.因此建议Keil开发,L011F3由于flash只有8K,因此不建议HAL库,建议使用cubemx+LL(或snippets库).0.起初,可以参考官方库 ...