这章的数据结构题很真实

T1 排队 bzoj 1699

题目大意:

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

思路:

ST表裸题

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define inf 2139062143
11 #define MAXN 100100
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 int n,q,g[MAXN],mn[MAXN][20],mx[MAXN][20];
21 int main()
22 {
23     n=read(),q=read();int a,b,t;
24     for(int i=1;i<=n;i++) mn[i][0]=mx[i][0]=g[i]=read();
25     for(int j=1;j<20;j++)
26         for(int i=1;i+(1<<j)-1<=n;i++)
27             mn[i][j]=min(mn[i][j-1],mn[i+(1<<(j-1))][j-1]),mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
28     while(q--)
29     {
30         a=read(),b=read(),t=b-a+1,t=(int)log2(t);
31         printf("%d\n",max(mx[a][t],mx[b-(1<<t)+1][t])-min(mn[a][t],mn[b-(1<<t)+1][t]));
32     }
33 }

View Code

T2 选择客栈 luogu 1311

题目大意:

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

求这样的点对的个数

思路:

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

对于每个颜色分别遍历

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define inf 2139062143
11 #define MAXN 200100
12 using namespace std;
13 inline int read()
14 {
15     int x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 int n,k,p,g[MAXN],c[MAXN],tmp[60],fst[60],las,cnt,res,ans,l[MAXN],to[MAXN];
21 int main()
22 {
23     n=read(),k=read(),p=read();
24     for(int i=1;i<=n;i++)
25     {
26         c[i]=read(),g[i]=read();
27         if(g[i]<=p) las=i;l[i]=las;
28         if(!tmp[c[i]]) fst[c[i]]=i,tmp[c[i]]=i;
29         else to[tmp[c[i]]]=i,tmp[c[i]]=i;
30     }
31     for(int i=0,pos;i<k;i++)
32     {
33         pos=fst[i],cnt=1,res=0;
34         while(to[pos])
35         {
36             if(to[pos]>n) break;
37             if(l[to[pos]]>=pos) res=cnt;
38             ans+=res,cnt++,pos=to[pos];
39         }
40     }
41     printf("%d",ans);
42 }

View Code

T3 最大值  bzoj 1012

题解链接

T4 花神游历各国 bzoj 3211

题解链接

T5 维护序列 bzoj 1798

题目大意:

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

思路:

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

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<algorithm>
 7 #include<queue>
 8 #include<vector>
 9 #define ll long long
10 #define inf 2139062143
11 #define MAXN 100100
12 using namespace std;
13 inline ll read()
14 {
15     ll x=0,f=1;char ch=getchar();
16     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
17     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
18     return x*f;
19 }
20 ll n,MOD,tp[MAXN<<2],tm[MAXN<<2],sum[MAXN<<2];
21 void build(int k,int l,int r)
22 {
23     tm[k]=1;
24     if(l==r) {return ;}
25     int mid=(l+r)>>1;
26     build(k<<1,l,mid);build(k<<1|1,mid+1,r);
27 }
28 inline void pshd(int k,int l,int mid,int r)
29 {
30     (sum[k<<1]*=tm[k])%=MOD,(sum[k<<1|1]*=tm[k])%=MOD;
31     (tp[k<<1]*=tm[k])%=MOD,(tp[k<<1|1]*=tm[k])%=MOD;
32     (tm[k<<1]*=tm[k])%=MOD,(tm[k<<1|1]*=tm[k])%=MOD,tm[k]=1;
33     (sum[k<<1]+=tp[k]*(mid-l+1)%MOD)%=MOD,(sum[k<<1|1]+=tp[k]*(r-mid)%MOD)%=MOD;
34     (tp[k<<1]+=tp[k])%=MOD,(tp[k<<1|1]+=tp[k])%=MOD,tp[k]=0;
35 }
36 inline void mdfm(int k,int l,int r,int a,int b,ll x)
37 {
38     if(l==a&&r==b){(sum[k]*=x)%=MOD,(tp[k]*=x)%=MOD,(tm[k]*=x)%=MOD;return ;}
39     int mid=(l+r)>>1;
40     pshd(k,l,mid,r);
41     if(mid>=b) mdfm(k<<1,l,mid,a,b,x);
42     else if(mid<a) mdfm(k<<1|1,mid+1,r,a,b,x);
43     else {mdfm(k<<1,l,mid,a,mid,x);mdfm(k<<1|1,mid+1,r,mid+1,b,x);}
44     sum[k]=(sum[k<<1]+sum[k<<1|1])%MOD;
45 }
46 inline void mdfp(int k,int l,int r,int a,int b,ll x)
47 {
48     if(l==a&&r==b) {(sum[k]+=x*(r-l+1)%MOD)%=MOD,tp[k]+=x;return ;}
49     int mid=(l+r)>>1;
50     pshd(k,l,mid,r);
51     if(mid>=b) mdfp(k<<1,l,mid,a,b,x);
52     else if(mid<a) mdfp(k<<1|1,mid+1,r,a,b,x);
53     else {mdfp(k<<1,l,mid,a,mid,x);mdfp(k<<1|1,mid+1,r,mid+1,b,x);}
54     sum[k]=(sum[k<<1]+sum[k<<1|1])%MOD;
55 }
56 inline ll query(int k,int l,int r,int a,int b)
57 {
58     if(l==a&&r==b) return sum[k];
59     int mid=(l+r)>>1;
60     pshd(k,l,mid,r);
61     if(mid>=b) return query(k<<1,l,mid,a,b);
62     else if(mid<a) return query(k<<1|1,mid+1,r,a,b);
63     else return (query(k<<1,l,mid,a,mid)+query(k<<1|1,mid+1,r,mid+1,b))%MOD;
64 }
65 int main()
66 {
67     n=read(),MOD=read();int a,b,c;build(1,1,n);
68     for(int i=1;i<=n;i++) mdfp(1,1,n,i,i,read());
69     int T=read();
70     while(T--)
71     {
72         a=read();
73         if(a==1) {a=read(),b=read(),c=read();mdfm(1,1,n,a,b,c);}
74         else if(a==2) {a=read(),b=read(),c=read();mdfp(1,1,n,a,b,c);}
75         else if(a==3) {a=read(),b=read();printf("%lld\n",query(1,1,n,a,b));}
76     }
77 }

View Code

转载于:https://www.cnblogs.com/yyc-jack-0920/p/9429765.html

蓝书4.1-4.4 树状数组、RMQ问题、线段树、倍增求LCA相关推荐

  1. 【BZOJ2441】【中山市选2011】小W的问题(树状数组+权值线段树)

    传送门 由于一个www不好统计,我们考虑拆成222个vvv来统计,也就是"312"和"213"这样的 把答案统计在"2"处,两边相乘就是答案 ...

  2. 树状数组--快捷的线段树

    问题概述:先输入一个数n,接下来输入n个数,然后输入一个指令,其中(Add i j)i和j为正整数,表示第i个营地增加j个人,(Sub i j)i和j为正整数,表示第i个营地减少j个人,(Query ...

  3. HDU 4417 Super Mario(线段树||树状数组+离线操作 之线段树篇)

    Mario is world-famous plumber. His "burly" figure and amazing jumping ability reminded in ...

  4. 数据结构 【树状数组】【线段树】【珂朵莉树】

    一.区间合并 1.AcWing245你能回答这些问题吗 分析: 线段树.维护四个变量,即可实现区间合并. mx 区间最大连续子段和 mx_l 以区间左端点为左界的最大连续字段和 mx_r 以区间左端点 ...

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

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

  6. 洛谷 P3368 【模板】树状数组 2(线段树区间加单点查找)

    题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的值 输入格式 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. 第二行包含N个 ...

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

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

  8. php 树状数组公式,PY个树状数组

    树状数组比较简单,于是就挑它下手了... 于是生活终于也对咱下手了... 要讲的就两个东西,一个是开数组,全局变量写最前面,数组是这么开的: f=[0 for i in range(500005)] ...

  9. HDU 6194 string string string 后缀数组 + RMQ(线段树)

    传送门:HDU6194 题意:问给定字符串中有多少种出现k次的子串. 思路:首先想到后缀数组经典问题,求出现不少于k次的子串的最大长度,类似的这题肯定就是在height数组上搞事情啦. 将height ...

  10. 计蒜客(青出于蓝胜于蓝) dfs序+树状数组

    武当派一共有 n 人,门派内 n 人按照武功高低进行排名,武功最高的人排名第 1,次高的人排名第 2,... 武功最低的人排名 第 n.现在我们用武功的排名来给每个人标号,除了祖师爷,每个人都有一个师 ...

最新文章

  1. numpy.linalg.svd
  2. 全球及中国橡胶助剂行业需求潜力及未来竞争态势研究报告2021版
  3. Linux网络监测在线工具
  4. EasyUI DataGrid 中字段 formatter 格式化不起作用
  5. Java基础 系统注解 @Override @Deprecated @SuppressWarnings 使用的方法及原因
  6. 数据分析工具具备什么功能
  7. c语言对分求解方程,用C语言对一元二次方程求解
  8. 网络安全设备Bypass功能介绍及分析
  9. 波士顿房价数据分析(R语言)
  10. [Jenkins] docker-slim 容器瘦身的使用
  11. Shopee怎么发货?虾皮无货源怎么发货?
  12. 超支化共轭聚合物纳米粒子-具有水分散性/PLGA 纳米粒子载药
  13. 爬虫是什么,该如何学习爬虫呢?
  14. MongoDB语法案例
  15. 关于汽车html网页设计完整版,10个以汽车为主题的网页设计与实现
  16. 不寻常的单元测试,第1部分:带蝙蝠的bash脚本
  17. 驾考 科目一 扣分罚款 复习的内容
  18. 社团划分评估-标准化互信息NMI的Python实现
  19. 无盘系统及服务器,无盘系统服务器的配置
  20. MBA-day5数学-应用题-工程问题

热门文章

  1. Java troubleshooting guide
  2. h5实现手机端等级进度条
  3. zoj 2760 How Many Shortest Path 最大流
  4. [leetcode笔记] Remove Duplicates from Sorted List II
  5. Entity Framework CodeFirst For Oracle[转]
  6. Python的代码结构
  7. c语言关键字-static
  8. 在yii2中,让你action参数支持POST数据的小方法
  9. 通配符及输入输出重定向、管道符和作业控制
  10. vue 中eslint 格式报错