这章的数据结构题很真实

T1 排队 bzoj 1699

题目大意:

求静态一些区间的最大值-最小值

思路:

ST表裸题

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
#define inf 2139062143
#define MAXN 100100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,q,g[MAXN],mn[MAXN][],mx[MAXN][];
int main()
{
n=read(),q=read();int a,b,t;
for(int i=;i<=n;i++) mn[i][]=mx[i][]=g[i]=read();
for(int j=;j<;j++)
for(int i=;i+(<<j)-<=n;i++)
mn[i][j]=min(mn[i][j-],mn[i+(<<(j-))][j-]),mx[i][j]=max(mx[i][j-],mx[i+(<<(j-))][j-]);
while(q--)
{
a=read(),b=read(),t=b-a+,t=(int)log2(t);
printf("%d\n",max(mx[a][t],mx[b-(<<t)+][t])-min(mn[a][t],mn[b-(<<t)+][t]));
}
}

T2 选择客栈 luogu 1311

题目大意:

每个点有两个值 颜色和最小消费值 如果两个点对之间存在一个点最小消费值<=n

求这样的点对的个数

思路:

把每个颜色分别用链表存起来 记录上一个<=p的位置

对于每个颜色分别遍历

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
#define inf 2139062143
#define MAXN 200100
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
int n,k,p,g[MAXN],c[MAXN],tmp[],fst[],las,cnt,res,ans,l[MAXN],to[MAXN];
int main()
{
n=read(),k=read(),p=read();
for(int i=;i<=n;i++)
{
c[i]=read(),g[i]=read();
if(g[i]<=p) las=i;l[i]=las;
if(!tmp[c[i]]) fst[c[i]]=i,tmp[c[i]]=i;
else to[tmp[c[i]]]=i,tmp[c[i]]=i;
}
for(int i=,pos;i<k;i++)
{
pos=fst[i],cnt=,res=;
while(to[pos])
{
if(to[pos]>n) break;
if(l[to[pos]]>=pos) res=cnt;
ans+=res,cnt++,pos=to[pos];
}
}
printf("%d",ans);
}

T3 最大值  bzoj 1012

题解链接

T4 花神游历各国 bzoj 3211

题解链接

T5 维护序列 bzoj 1798

题目大意:

区间乘法和加法以及区间求和

思路:

维护两个tag 所有地方注意先乘后加

 #include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
#define ll long long
#define inf 2139062143
#define MAXN 100100
using namespace std;
inline ll read()
{
ll x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=x*+ch-'';ch=getchar();}
return x*f;
}
ll n,MOD,tp[MAXN<<],tm[MAXN<<],sum[MAXN<<];
void build(int k,int l,int r)
{
tm[k]=;
if(l==r) {return ;}
int mid=(l+r)>>;
build(k<<,l,mid);build(k<<|,mid+,r);
}
inline void pshd(int k,int l,int mid,int r)
{
(sum[k<<]*=tm[k])%=MOD,(sum[k<<|]*=tm[k])%=MOD;
(tp[k<<]*=tm[k])%=MOD,(tp[k<<|]*=tm[k])%=MOD;
(tm[k<<]*=tm[k])%=MOD,(tm[k<<|]*=tm[k])%=MOD,tm[k]=;
(sum[k<<]+=tp[k]*(mid-l+)%MOD)%=MOD,(sum[k<<|]+=tp[k]*(r-mid)%MOD)%=MOD;
(tp[k<<]+=tp[k])%=MOD,(tp[k<<|]+=tp[k])%=MOD,tp[k]=;
}
inline void mdfm(int k,int l,int r,int a,int b,ll x)
{
if(l==a&&r==b){(sum[k]*=x)%=MOD,(tp[k]*=x)%=MOD,(tm[k]*=x)%=MOD;return ;}
int mid=(l+r)>>;
pshd(k,l,mid,r);
if(mid>=b) mdfm(k<<,l,mid,a,b,x);
else if(mid<a) mdfm(k<<|,mid+,r,a,b,x);
else {mdfm(k<<,l,mid,a,mid,x);mdfm(k<<|,mid+,r,mid+,b,x);}
sum[k]=(sum[k<<]+sum[k<<|])%MOD;
}
inline void mdfp(int k,int l,int r,int a,int b,ll x)
{
if(l==a&&r==b) {(sum[k]+=x*(r-l+)%MOD)%=MOD,tp[k]+=x;return ;}
int mid=(l+r)>>;
pshd(k,l,mid,r);
if(mid>=b) mdfp(k<<,l,mid,a,b,x);
else if(mid<a) mdfp(k<<|,mid+,r,a,b,x);
else {mdfp(k<<,l,mid,a,mid,x);mdfp(k<<|,mid+,r,mid+,b,x);}
sum[k]=(sum[k<<]+sum[k<<|])%MOD;
}
inline ll query(int k,int l,int r,int a,int b)
{
if(l==a&&r==b) return sum[k];
int mid=(l+r)>>;
pshd(k,l,mid,r);
if(mid>=b) return query(k<<,l,mid,a,b);
else if(mid<a) return query(k<<|,mid+,r,a,b);
else return (query(k<<,l,mid,a,mid)+query(k<<|,mid+,r,mid+,b))%MOD;
}
int main()
{
n=read(),MOD=read();int a,b,c;build(,,n);
for(int i=;i<=n;i++) mdfp(,,n,i,i,read());
int T=read();
while(T--)
{
a=read();
if(a==) {a=read(),b=read(),c=read();mdfm(,,n,a,b,c);}
else if(a==) {a=read(),b=read(),c=read();mdfp(,,n,a,b,c);}
else if(a==) {a=read(),b=read();printf("%lld\n",query(,,n,a,b));}
}
}

蓝书4.1-4.4 树状数组、RMQ问题、线段树、倍增求LCA的更多相关文章

  1. 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  2. [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)

    这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...

  3. bzoj4785:[ZJOI2017]树状数组:二维线段树

    分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...

  4. HDU - 1166 树状数组模板(线段树也写了一遍)

    题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以) 思路: 树状数组的单点查询,单点修改和区间查询. 树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改.这里面用到一个 ...

  5. BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec   Memory Limit: 512 MB Submit: 418   Solved: 235 [ Submit][ ...

  6. BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树

    题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...

  7. 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)

    传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...

  8. HDU 4325 离散化+树状数组 或者 不使用树状数组

    题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放. 由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段 ...

  9. 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...

  10. BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1012 两种操作: 1.求序列末尾n个数中的最大值. 2.在序列末尾插入一个数. 分析 线段树求 ...

随机推荐

  1. 【design pattern】代理模式

    前言 设计模式分为三大类: 创建型模式:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式: 结构型模式:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式: 行为型模式 ...

  2. 201621123082《Java程序设计》第1周学习总结

    1. 本周学习总结: 关键词: 了解Java语言的发展历史.了解Java语言的特点.JDK.JRE.JVM.eclipse等. 联系: JDK是提供给Java开发人员使用的一组工具,JDK包含JVM及 ...

  3. jQuery的ready与js的load事件的区别

    摘自:http://www.cnblogs.com/see7di/archive/2011/07/15/2239677.html 为了理解这两个事件的异同,读者应该先了解HTML文档加载的顺序. DO ...

  4. Linux 下 Jenkins安装

    Jenkins介绍 Jenkins是基于Java开发的一种持续集成工具,用于监控持续重复的工作,功能包括: 1.持续的软件版本发布/测试项目. 2.监控外部调用执行的工作. 安装环境 操作系统:lin ...

  5. 79-Envelopes,包络指标.(2015.7.1)

    Envelopes 包络指标 观井映天 2015.7.1

  6. 【Codeforces 1042D】Petya and Array

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 把a[i]处理成前缀和 离散化. 枚举i从1..n假设a[i]是区间和的a[r] 显然我们需要找到a[r]-a[l]<t的l的个数 即a ...

  7. 修改windows 2012/win8、win7远程桌面连接默认端口的方法

    远程桌面连接服务基于端口3389,入侵者一般先扫描主机开放端口,一旦发现其开放了3389端口,就会进行下一步的入侵,所以我们只需要修改该务默认端口就可以避开大多数入侵者的耳目. 修改windows 2 ...

  8. oracle 互锁的sql查询

    SELECT DECODE(request, 0, 'Holder: ', 'Waiter: ') || sid sess,       id1,       id2,       lmode,    ...

  9. P1072 Hankson的趣味题

    #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #inclu ...

  10. [K/3Cloud] 创建一个单据转换插件

    概念: 创建一个业务单据转换插件,在单据转换的各个时点干预单据转换的相关逻辑控制. 示例: 新建一个类,继承自单据转换插件基类Kingdee.BOS.Core.Metadata.ConvertElem ...