蓝书4.1-4.4 树状数组、RMQ问题、线段树、倍增求LCA
这章的数据结构题很真实
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的更多相关文章
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- [Usaco2014 Open Gold ]Cow Optics (树状数组+扫描线/函数式线段树)
这道题一上手就知道怎么做了= = 直接求出原光路和从目标点出发的光路,求这些光路的交点就行了 然后用树状数组+扫描线或函数式线段树就能过了= = 大量的离散+模拟+二分什么的特别恶心,考试的时候是想到 ...
- bzoj4785:[ZJOI2017]树状数组:二维线段树
分析: "如果你对树状数组比较熟悉,不难发现可怜求的是后缀和" 设数列为\(A\),那么可怜求的就是\(A_{l-1}\)到\(A_{r-1}\)的和(即\(l-1\)的后缀减\( ...
- HDU - 1166 树状数组模板(线段树也写了一遍)
题意: 汉语题就不说题意了,用到单点修改和区间查询(树状数组和线段树都可以) 思路: 树状数组的单点查询,单点修改和区间查询. 树状数组是巧妙运用二进制的规律建树,建树就相当于单点修改.这里面用到一个 ...
- BZOJ 3110([Zjoi2013]K大数查询-区间第k大[段修改,在线]-树状数组套函数式线段树)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 418 Solved: 235 [ Submit][ ...
- BZOJ 4785 [Zjoi2017]树状数组 | 二维线段树
题目链接 BZOJ 4785 题解 这道题真是令人头秃 = = 可以看出题面中的九条可怜把求前缀和写成了求后缀和,然后他求的区间和却仍然是sum[r] ^ sum[l - 1],实际上求的是闭区间[l ...
- 2019.01.21 bzoj2441: [中山市选2011]小W的问题(树状数组+权值线段树)
传送门 数据结构优化计数菜题. 题意简述:给nnn个点问有多少个www型. www型的定义: 由5个不同的点组成,满足x1<x2<x3<x4<x5,x3>x1>x2 ...
- HDU 4325 离散化+树状数组 或者 不使用树状数组
题意:给出一些花的开放时间段,然后询问某个时间点有几朵花正在开放. 由于ti<1e9,我们需要先将时间离散化,然后将时间点抽象为一个数组中的点,显然,我们需要进行区间更新和单点查询,可以考虑线段 ...
- 【BZOJ】1012: [JSOI2008]最大数maxnumber(树状数组+rmq)
http://www.lydsy.com/JudgeOnline/problem.php?id=1012 树状数组原来我只懂得sum和add的操作,今天才知道可以有求区间最值的操作,我学习了一下写了个 ...
- BZOJ_1012_[JSOI2008]_最大数maxnumber_(线段树/树状数组+RMQ)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1012 两种操作: 1.求序列末尾n个数中的最大值. 2.在序列末尾插入一个数. 分析 线段树求 ...
随机推荐
- String 工具类
package com.mytripod.util; import sun.rmi.runtime.Log; import java.io.UnsupportedEncodingException; ...
- delphi clipboard
判断clipboard里的格式: if CliPBoard.HasFormat(CF_TEXT) then EdIT1.Text := CliPBoard.AsText ...
- 全国高校json数据包(复python解析代码)
由于这段时间需要有关学校的三级联动插件,找了很久没有找到合适的,所以去教育部官网下载了一份全国普通高校名单(2019年), 这里附上解析该xls文件的代码 import xlrd import jso ...
- LeetCode(29)Divide Two Integers
题目 Divide two integers without using multiplication, division and mod operator. If it is overflow, r ...
- 集训第五周动态规划 G题 回文串
Description A palindrome is a symmetrical string, that is, a string read identically from left to ri ...
- Altium designer中生成gerbera文件
在Altium designer中生成gerbera文件的方法有很多,不同版本,差异行不太大,正如下边链接地址里博主在10版本下的方法,在6.0版本长也是这样 http://blog.sina.com ...
- 【转】SQLServer连接字符串配置:MultipleActiveResultSets
ADO.NET 1.x 利用SqlDataReader读取数据,针对每个结果集需要一个独立的连接.当然,你还必须管理这些连接并且要付出相应的内存和潜在的应用程序中的高度拥挤的瓶颈代价-特别是在数据集中 ...
- 60. Spring Boot写后感【从零开始学Spring Boot】
从2016年4月15日到2016年7月20日经历长达3个月的时间,[从零开始学习Spring Boot]系列就要告一段落了.国内的各种资源都比较乱或者是copy 来copy去的,错了也不加以修正下,导 ...
- 如何将一个本来需要发几十条sql语句的需求优化成两条(非sql语句优化,而是解决方法)
首先声明,本人所有博客均为原创,谢绝转载! 今天接到一个需求,如下 这里解释一下,为什么是几十条,因为这里面每个公式的每个条件都是一个单独的数据如净利润就是一条sql语句,而且分散在不同的表,如果此方 ...
- Linux中kill,pkill,killall和xkill命令汇总讲解
终止一个进程或终止一个正在运行的程式,一般是通过 kill .killall.pkill.xkill 等进行.比如一个程式已死掉,但又不能退出,这时就应该考虑应用这些工具. 另 外应用的场合就是在服务 ...