hunnu11460—区间求最值(线段树模板)
来源:互联网 发布:mac免费软件 编辑:程序博客网 时间:2024/06/07 06:46
题目链接:传送门
区间求最值Time Limit: 3000ms, Special Time Limit:7500ms, Memory Limit:32768KBTotal submit users: 83, Accepted users: 60Problem 11460 : No special judgementProblem description 给定一个长度为N 的数组,有q个询问,每个询问是求在数组的一段区间内那个元素的因子的个数最大,比如24的因子的个数就是8。Input 首先是一个整数t,表示有t组测试数据,每组测试数据的第一行是一个整数N(1<=N<=10^6),第二行有N个整数ai(1<=ai<=10^6,i=1,2,.....N)表示数组的元素。第三行有一个整数q(1<=q<=10^5),代表有q个询问,接下来每一行有两个整数,li,ri(li<=ri,li>=1,ri<=N).代表数组的一段区间,并且li+1>=li,ri+1>=ri。
Output 对于每组数据的每个询问都输出一个整数表示在这段区间里面元素因子个数的最大值。
Sample Input
1102 3 5 6 9 11 12 36 39 4432 63 83 9Sample Output
499
解题思路:先打表求出1000000以内每个数的因子个数,然后线段树求区间最大值,用RMQ会爆内存
#include <cstdio> #include <cstring> #include <cmath> #include <iostream> #include <queue>#include <set>#include <string>#include <stack>#include <algorithm>#include <map>using namespace std; typedef __int64 ll;const int N = 1000008;const int M = 5007;const int INF = 0x3fffffff;const int mod = 1e9+7;const double Pi = acos(-1.0);const double sm = 1e-9;int rec[N<<2];//Sum求和,Add为懒惰标记 int A[N];//存原数组数据下标[1,n] //PushUp函数更新节点信息 ,这里是求和 void PushUp(int rt){rec[rt]=max(rec[rt<<1],rec[rt<<1|1]);} //Build函数建树 void Build(int l,int r,int rt){ //l,r表示当前节点区间,rt表示当前节点编号 if(l==r) {//若到达叶节点 rec[rt]=A[l];//储存数组值 return; } int m=(l+r)>>1; //左右递归 Build(l,m,rt<<1); Build(m+1,r,rt<<1|1); //更新信息 PushUp(rt); } int Query(int L,int R,int l,int r,int rt){//L,R表示操作区间,l,r表示当前节点区间,rt表示当前节点编号 if(L <= l && r <= R){ //在区间内,直接返回 return rec[rt]; } int m=(l+r)>>1; //累计答案 int ANS=0; if(L <= m) ANS=max(ANS,Query(L,R,l,m,rt<<1)); if(R > m) ANS=max(ANS,Query(L,R,m+1,r,rt<<1|1)); return ANS; } int num[N];void getNumDivisor( int n ){fill( num , num+N , 0 );for( int i = 1 ; i*i < n ; ++i ){for( int j = i ; i*j < n ; ++j ){num[i*j] += 2;if( i == j ) num[i*j]--;}}}int main(){getNumDivisor(N);int T,n,m,a,b;scanf("%d",&T);while( T-- ){scanf("%d",&n);for( int i = 1 ; i <= n ; ++i ){scanf("%d",&a);A[i] = num[a];}Build(1,n,1);scanf("%d",&m);for( int i = 0 ; i < m ; ++i ){scanf("%d%d",&a,&b);printf("%d\n",Query(a,b,1,n,1));}}return 0;}
阅读全文
0 0
- hunnu11460—区间求最值(线段树模板)
- hunnu11460(线段树解RMQ问题)
- 线段树模板(区间修改)——hdu1698
- 线段树模板(区间更新)
- 模板:线段树(2)区间修改
- 线段树模板(区间最值)
- 线段树模板(区间乘混加)
- ACM_线段树模板(区间更新)
- 线段树 区间求和模板 (区间修改)
- 【模板】线段树 区间加,区间求和 (模板题:P3372线段树1)
- 线段树区间翻转模板
- 线段树 区间更新模板
- [ 模板 ] 线段树区间修改
- 【模板】区间修改-线段树
- 线段树模板 区间加减 区间修改
- [模板]-线段树-区间修改 + 区间查询
- 【模板】树状数组 区间修改,区间求和 (模板题:洛谷P3372线段树1)
- 【模板】线段树 区间加+乘,区间求和 (模板题:洛谷P3373)
- 线段树相关
- Android Studio Error:null value in entry: outputDirectory=null编译报错问题
- MyBatis 拦截器(4)
- 键盘钩子
- 两数组的交 II
- hunnu11460—区间求最值(线段树模板)
- java数组创建的三种方式
- BigDecimal精确计算
- Linux IO Scheduler -- Deadline
- 一起Talk Android吧(第二十八回:Android版Hello World)
- 极密宝、Lastpass、1password密码管理软件到底哪家强?
- 我遇到的异常及解决办法汇总
- C++笔试概念部分1
- ElasticSearch基础知识--检索文档