#线段树,约数#洛谷 3889 [GDOI2014]吃
题目
有一个长度为\(n\)的数列,现在有\(m\)组询问每次给出区间\([l,r]\),查询
\]
分析
首先是离线询问,考虑把\(i\)拆成两部分处理
也就是\(\max\{\max\{ans_{i<l}\},\max\{ans_{i>r}\}\}\)
后面这一坨将数列和询问编号翻转就转换成前面这一坨
那就按照区间的左端点递增排序,考虑小于左端点的位置所做的贡献,
处理每个约数下一次出现的位置,如果这个位置出现在区间内,说明这个约数是可以做出贡献的
那么预处理每个位置的数中每个约数下一次出现的位置,并用线段树维护区间最大值即可
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cstring>
#define rr register
using namespace std;
const int N=100011;
struct rec{int l,r,rk;}q[N];
int n,m,a[N],ir[N],w[N<<2],h[N];
int ans[N],A[N][131],B[N][131],C[N];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
bool cmp(rec x,rec y){return x.l<y.l;}
inline signed max(int a,int b){return a>b?a:b;}
inline void update(int k,int l,int r,int x,int y){
if (l==r) {w[k]=max(w[k],y); return;}
rr int mid=(l+r)>>1;
if (x<=mid) update(k<<1,l,mid,x,y);
else update(k<<1|1,mid+1,r,x,y);
w[k]=max(w[k<<1],w[k<<1|1]);
}
inline signed query(int k,int l,int r,int x,int y){
if (l==x&&r==y) return w[k];
rr int mid=(l+r)>>1;
if (y<=mid) return query(k<<1,l,mid,x,y);
else if (x>mid) return query(k<<1|1,mid+1,r,x,y);
else return max(query(k<<1,l,mid,x,mid),query(k<<1|1,mid+1,r,mid+1,y));
}
inline void doit(){
sort(q+1,q+1+m,cmp);
memset(h,0,sizeof(h));
memset(w,0,sizeof(w));
for (rr int i=n,t=0;i;C[i--]=t,t=0)
for (rr int j=1;j<=ir[a[i]];++j)
if (a[i]%j==0){
if (h[j]) A[i][++t]=j,B[i][t]=h[j];
h[j]=i;
if (j*j<a[i]){
if (h[a[i]/j]) A[i][++t]=a[i]/j,B[i][t]=h[a[i]/j];
h[a[i]/j]=i;
}
}
for (rr int i=1,j=1;i<=m;++i){
for (;j<q[i].l;++j)
for (rr int o=1;o<=C[j];++o)
update(1,1,n,B[j][o],A[j][o]);
ans[q[i].rk]=max(ans[q[i].rk],query(1,1,n,q[i].l,q[i].r));
}
}
signed main(){
for (rr int i=1;i<317;++i) ir[i*i]=1;
for (rr int i=1;i<N;++i) ir[i]+=ir[i-1];
n=iut(); for (rr int i=1;i<=n;++i) a[i]=iut();
m=iut(); for (rr int i=1;i<=m;++i) q[i]=(rec){iut(),iut(),i};
doit(); for (rr int i=1;i<=m;++i) swap(q[i].l,q[i].r);
for (rr int i=1;i<=m;++i) q[i].l=n-q[i].l+1,q[i].r=n-q[i].r+1;
reverse(a+1,a+1+n),doit();
for (rr int i=1;i<=m;++i) print(ans[i]),putchar(10);
return 0;
}
#线段树,约数#洛谷 3889 [GDOI2014]吃的更多相关文章
- 【线段树】洛谷 P3372 【模板】线段树 1
动态开结点线段树板子. #include<cstdio> using namespace std; typedef long long ll; ll sumv[400005],delta[ ...
- AC日记——【模板】线段树 2 洛谷 P3373
P3373 [模板]线段树 2387通过1.8K提交标签难度 提高+/省选- 提交 讨论 题解 最新讨论 更多讨论 2333最后三个点卡常数.迷之RE感觉这题很迷啊好像一共三组测试数据.友情提示:开l ...
- AC日记——【模板】线段树 1 洛谷 P3372
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个 ...
- 线段树【洛谷P2894】 [USACO08FEB]酒店Hotel
P2894 [USACO08FEB]酒店Hotel 参考样例,第一行输入n,m ,n代表有n个房间,编号为1---n,开始都为空房,m表示以下有m行操作,以下 每行先输入一个数 i ,表示一种操作: ...
- P3372 【模板】线段树 1 洛谷
https://www.luogu.org/problem/show?pid=3372 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 ...
- 洛谷 P1736 创意吃鱼法
题目描述 题目链接:https://www.luogu.org/problemnew/show/P1736 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢( ...
- 洛谷 P1736 创意吃鱼法 Label:dp || 前缀和
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- 洛谷P1736 创意吃鱼法
题目描述 回到家中的猫猫把三桶鱼全部转移到了她那长方形大池子中,然后开始思考:到底要以何种方法吃鱼呢(猫猫就是这么可爱,吃鱼也要想好吃法 ^_*).她发现,把大池子视为01矩阵(0表示对应位置无鱼,1 ...
- [虚树模板] 洛谷P2495 消耗战
题意:给定树上k个点,求切断这些点到根路径的最小代价.∑k <= 5e5 解:虚树. 构建虚树大概是这样的:设加入点与栈顶的lca为y,比较y和栈中第二个元素的DFS序大小关系. 代码如下: i ...
- 洛谷P1736 创意吃鱼法 dp
正解:dp 解题报告: 早就想写dp的题目辣!我发现我的dp好差啊QAQ所以看到列表的小朋友写dp的题目就跟着他们的步伐做下题好辣QwQ 这题的话没有那——么难,大概说下趴QwQ 首先说下题意 前面一 ...
随机推荐
- EasyExcel使用及自定义设置单元格样式
EasyExcel使用及自定义设置单元格样式 https://www.cnblogs.com/Hizy/p/11825886.html easyexcel 自动设置列宽 https://www.man ...
- rpartition和partition按分割符分割
# rpartition 从目标字符串的末尾也就是右边开始搜索分割符,如果字符串包含指定的分割符 则返回一个3元的元组,第一个为分割符左边的子串,第二个为分割符本身, 第三个为分割符右边的字串. st ...
- 数据分析day02
案例 需求:双均线策略制定 1.使用tushare包获取某股票的历史行情数据 2.计算该股票历史数据的5日均线和30日均线 - 什么是均线? - 对于每一个交易日,都可以计算出前N天的移动平均值,然后 ...
- 第一百一十六篇: JavaScript理解对象
好家伙,本篇为<JS高级程序设计>第八章"对象.类与面向对象编程"学习笔记 1.关于对象 ECMA-262将对象定义为一组属性的无序集合.严格来说,这意味着对象就是 ...
- Java纯手打web服务器(一)
目录 在主线程中进行等待客户端请求: 这里主要说下解析流程: 在主线程中进行等待客户端请求: public static void main(String[] args) { HttpServer1 ...
- 【Azure APIM】APIM 策略语句如何读取请求头中所携带的Cookie信息并保存为变量
问题描述 需要在APIM策略中对请求所携带的Cookie中的token值进行JWT验证,如果获取Cookie中的值并且作为变量保存,然后在JWT 验证中使用呢? 问题解答 第一步:获取Cookie中的 ...
- 【Azure 应用程序见解】在Docker中运行的ASP.NET Core应用如何开启Application Insights的Profiler Trace呢?
问题描述 使用Azure Application Insights收集AKS中ASP.NET Core应用的监控数据,自动收集请求的Trace情况,用于分析单个请求在应用内部的耗时及处理事件情况,参考 ...
- 调试 Docker 容器内部进程
首发于官方博客:https://nebula-graph.com.cn/posts/debug-nebula-graph-processes-docker/ 摘要:本文以 Nebula Graph 进 ...
- TR069-STUN
原理 1.NAT穿越技术,为了解决NAT设备对P2P网络的通信限制 2.作用:检测网络中是否存在NAT设备,并获取两个通信端点经NAT设备分配的IP地址和端口号,然后建立一条可穿越NAT的P2P链 ...
- aardio 嵌入 其他应用程序
aardio 嵌入 其他应用程序 需求 这个chrome壳不能进行拖拽和缩放,所以再套一个壳,可以再分屏的时候用 import win.ui; /*DSG{{*/ winform = win.form ...