rmq模板
来源:互联网 发布:会计电算化软件用友 编辑:程序博客网 时间:2024/06/17 23:50
来自kuangbin模板
#include <bits/stdc++.h> #define N 1010 #define mem(a,x) memset(a,x,sizeof a) using namespace std; #define INF 0x3f3f3f3f const double eps = 1e-8; typedef long long ll; const int MAXN = 50010; int dpmin[MAXN][20]; int dpmax[MAXN][20]; int mm[MAXN]; int mi[MAXN]; void initRMQ(int n,int b[]){ mm[0] = -1; for(int i=1;i<=n;i++){ mm[i] = ((i&(i-1))== 0 )? mm[i-1]+1: mm[i-1]; dpmin[i][0] = dpmax[i][0] = b[i]; } for(int j=1;j<=mm[n];j++) for(int i=1;i+(1<<j)-1 <=n;i++){ dpmax[i][j] = max(dpmax[i][j-1] , dpmax[i+(1<<(j-1))][j-1]); dpmin[i][j] = min(dpmin[i][j-1] , dpmin[i+(1<<(j-1))][j-1]); } } int rmqmax(int x,int y){ int k = mm[y-x+1]; return max(dpmax[x][k], dpmax[y-(1<<k)+1][k]); } int rmqmin(int x,int y){ int k = mm[y-x+1]; return min(dpmin[x][k], dpmin[y-(1<<k)+1][k]); } int arr[MAXN]; int main(){ int n; int t;scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&arr[i]); initRMQ(n,arr); int q;scanf("%d",&q); while(q--){ int a,b,c;scanf("%d%d%d",&c,&a,&b); if(c == 1) printf("%d\n",rmqmin(a,b)); else if(c == 2) printf("%d\n",rmqmax(a,b)); else printf("%d\n",rmqmax(a,b)+rmqmin(a,b)); } } return 0; }
阅读全文
0 0
- rmq 模板
- RMQ模板
- rmq模板
- RMQ 模板
- RMQ 模板
- RMQ 模板
- rmq模板
- RMQ模板
- RMQ模板
- RMQ模板
- RMQ 模板
- RMQ 模板
- 【模板】RMQ
- RMQ模板
- RMQ模板
- RMQ模板
- RMQ模板
- RMQ 模板
- codeforces 808B——Average Sleep Time
- linux ln符号链接
- C++实验题---填空(运算符重载)
- codeforces 808C——Tea Party(贪心)
- 判断素数How many prime numbers
- rmq模板
- linux的SCP命令
- C++实验题---填空(类与继承)
- OracleOraDb11g_home1ClrAgent服务
- Ubuntu16.04 使用Graphviz画图
- springmv里面的mySQL的配置操作
- android eclipse的环境配置
- springmvc里面的mogoDB的配置操作
- Oracle 11g必须开启的服务及服务详细介绍