P3889-[GDOI2014]吃【线段树】

正题

题目链接:https://www.luogu.com.cn/problem/P3889


题目大意

nnn个数的序列,mmm次询问,每次给出一个区间[l,r][l,r][l,r],求在区间内和区间外各选一个数使得他们的gcdgcdgcd最大


解题思路

首先没有修改且没有要求强制在线,考虑离线做法。

我们可以将问题转换为对于求一个与之相交的区间使得该区间两端点的gcdgcdgcd最大。这样我们可以知道如果对于kkk个点有相同的因子,有k(k−1)2\frac{k(k-1)}{2}2k(k1)个区间,但是只有相邻的点构成的区间会对答案造成影响,所以总共只有k−1k-1k1个区间

先考虑如何计算在区间的左边选择时的结果。首先我们可以将区间按照右端点从小到大排序,然后用指针扫描右端点,线段树维护该右端点时的左端点的答案。这样我们对于每个数可以枚举他的因子然后在记录前一个该因子的数的位置即可进行维护

时间复杂度O(nnlog⁡n)O(n\sqrt n\log n)O(nnlogn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10,L=1e5;
int n,m,a[N],pre[N],ans[N];
int w[N*4],lazy[N*4];
struct node{int l,r,num;
}q[N];
bool cmp(node x,node y)
{return x.r<y.r;}
bool cMp(node x,node y)
{return x.l>y.l;}
void Downdata(int x){w[x<<1]=max(w[x<<1],lazy[x]);lazy[x<<1]=max(lazy[x<<1],lazy[x]);w[x<<1|1]=max(w[x<<1|1],lazy[x]);lazy[x<<1|1]=max(lazy[x<<1|1],lazy[x]);return;
}
void Change(int x,int L,int R,int l,int r,int val){if(L==l&&R==r){w[x]=max(w[x],val);lazy[x]=max(lazy[x],val);return;}Downdata(x);int mid=(L+R)>>1;if(r<=mid)Change(x<<1,L,mid,l,r,val);else if(l>mid)Change(x<<1|1,mid+1,R,l,r,val);else Change(x<<1,L,mid,l,mid,val),Change(x<<1|1,mid+1,R,mid+1,r,val);w[x]=max(w[x<<1],w[x<<1|1]);return;
}
int Ask(int x,int L,int R,int pos){if(L==R)return w[x];Downdata(x);int mid=(L+R)>>1;if(pos<=mid)return Ask(x<<1,L,mid,pos);if(pos>mid)return Ask(x<<1|1,mid+1,R,pos);return 0;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);scanf("%d",&m);for(int i=1;i<=m;i++)scanf("%d%d",&q[i].l,&q[i].r),q[i].num=i;sort(q+1,q+1+m,cmp);int z=1;for(int i=1;i<=n;i++){for(int k=1;k*k<=a[i];k++)if(a[i]%k==0){if(pre[k])Change(1,1,L,pre[k]+1,i,k);pre[k]=i;if(a[i]/k==k)continue;if(pre[a[i]/k])Change(1,1,L,pre[a[i]/k]+1,i,a[i]/k);pre[a[i]/k]=i;}while(z<=m&&q[z].r<=i){ans[q[z].num]=Ask(1,1,L,q[z].l);z++;}}memset(w,0,sizeof(w));memset(lazy,0,sizeof(lazy));memset(pre,0,sizeof(pre));sort(q+1,q+1+m,cMp);z=1;for(int i=n;i>=1;i--){for(int k=1;k*k<=a[i];k++)if(a[i]%k==0){if(pre[k])Change(1,1,L,i,pre[k]-1,k);pre[k]=i;if(a[i]/k==k)continue;if(pre[a[i]/k])Change(1,1,L,i,pre[a[i]/k]-1,a[i]/k);pre[a[i]/k]=i;}while(z<=m&&q[z].l>=i){ans[q[z].num]=max(ans[q[z].num],Ask(1,1,L,q[z].r));z++;}}for(int i=1;i<=m;i++)printf("%d\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.NET Core amp; Docker 实战经验分享

一.前言最近一直在研究和实践ASP.NET Core、Docker、持续集成。在ASP.NET Core 和 Dcoker结合下遇到了一些坑&#xff0c;在此记录和分享&#xff0c;希望对大家有一些帮助。二.中间镜像我前面写过一个 《ASP.NET Core & Docker 零基础持续集成 》的教程。里面我们通过持续…

codeforces E. Picking Strings 构造

题目链接 Picking String 题意 给出字符串S和T&#xff0c;1e5个询问&#xff0c;每次询问S的一段区间是否能转变成T的一段区间。 转变方式&#xff1a; A>BCA>BCB>ACB>ACC>ABC>ABAAAAAA可以消除 题解 我们从以上四个条件出发推导出更加精华的条件 B>…

P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】

正题 题目链接:https://www.luogu.com.cn/problem/P4169 题目大意 nnn个点&#xff0c;然后每次操作 加一个新的点询问一个点更近的点 解题思路 定义tit_iti​表示第几个操作&#xff0c;开始就有的点tit_iti​为000 假设最近的点在左上角&#xff0c;那么有要求ti<tj,xi…

【Floyed】【匈牙利算法】导弹(jzoj 1610)

题目大意&#xff1a; 有n个城市&#xff0c;有一部分是A国的&#xff0c;有一部分是B国的&#xff08;小于A国的&#xff09;&#xff0c;A国每个城市都有一枚导弹&#xff08;只有一枚&#xff09;&#xff0c;炸毁别的城市的时间是到这个城市的距离&#xff0c;请问A国最快…

codeforces G - Almost Increasing Array 动态规划、动态开点线段树

题意 给出一个序列&#xff0c;允许删除一个元素&#xff0c;并将任意元素的值修改为任意整数&#xff0c;问最少修改多少个元素使得序列变成严格单调递增的序列&#xff1f; 题解 这道题目很具有启发性&#xff1a; 不考虑删除元素&#xff0c;原数列各个数值减去他们下标得…

Oracle .NET Core Beta驱动已出,自己动手写EF Core Oracle

使用.net core也有一段时间了&#xff0c;一直都没有Oracle官方的正式版驱动程序&#xff0c;更别说EF版本了。之前基于Oracle官方的.net core预览版本写了个Dapper的数据库操作实现&#xff0c;但是总感觉不太完美&#xff0c;有消息称Oracle官方的EF版本可能要到第三季度出了…

nssl1452-排行榜【数论】

正题 题目大意 给出nnn&#xff0c;求一个长度为2n2n2n的由1∼n1\sim n1∼n各两个组成的一个序列使得有一个数的前缀数量不小于任何数字。 解题思路 首先这个数字肯定是第一个数字&#xff0c;这里假设为111&#xff0c;那么要求任意位置111的前缀数量都不小于别的数。 也就…

【离散化】【差分】幻灯片(jzoj 1609)

幻灯片 题目大意&#xff1a; 有n个幻灯片映在一起&#xff0c;每个幻灯片的的左上角是a1,a2,右上角是a3,a4,颜色是a5当多个幻灯片在同一个位置时&#xff0c;颜色就是他们的和&#xff0c;求有所少种颜色 样例输入 3 2 2 3 3 2 2 0 4 4 1 1 1 3 5 3 样例输出 4 数据…

.net core在网关中统一配置Swagger

最近在做微服务的时候&#xff0c;由于我们是采用前后端分离来开发的&#xff0c;提供给前端的直接是Swagger&#xff0c;如果Swagger分布在各个API中&#xff0c;前端查看Swagger的时候非常不便&#xff0c;因此&#xff0c;我们试着将Swagger集中放到网关中。这里我用两个API…

P4074-[WC2013]糖果公园【树上带修莫队】

正题 题目链接:https://www.luogu.com.cn/problem/P4074 题目大意 nnn个点的一颗数&#xff0c;第iii个点有一颗cic_ici​种类的糖。 第iii次获得jjj种类的糖可以产生价值wi∗vjw_i*v_jwi​∗vj​。 每次操作 修改一个点的糖果种类询问一个路径的价值和 解题思路 用欧拉序…

闲来无事刷水题、简单博弈论专题、sg函数、洛谷

记 今天闲来无事&#xff0c;不想刷codeforces了&#xff0c;到洛谷提高组训练营找几道水题刷着玩玩&#xff08;虽然自己早已过了打OI的年纪&#xff09;&#xff5e; 简单博弈论专题 P1199 三国游戏 这么考虑&#xff0c;由于电脑总是不能让我搭配出当前能搭配出的最大的…

医院(jzoj 1611)

医院 题目大意&#xff1a; 有n个城市&#xff0c;有m条线路使他们相连&#xff08;有向&#xff09;&#xff0c; 在一些城市中建立医院&#xff0c;相连的城市只能有一间医院&#xff0c;每个医院可以派医生去别的城市&#xff0c;当医生走的线路>3时&#xff0c;他们会…

2019.01.24【NOIP普及组】模拟赛C组

总结 这一次的分数&#xff1a;1002562.562.5250 第一题老实打完&#xff0c;100分&#xff0c;第二题蒙点25分&#xff0c;第三题只打了Floyed&#xff0c;还有一部分&#xff08;匈牙利算法&#xff09;没打&#xff0c;第四题蒙点特判&#xff0c;62.5,&#xff08;说实在我…

nssl1453-Fibonacci数列【矩阵乘法,线段树】

正题 题目大意 给出nnn和si(i∈[0..n−1])s_i(i\in[0..n-1])si​(i∈[0..n−1])&#xff0c;对于大部分情况有sxsx%ns_xs_{x\%n}sx​sx%n​。 有递推式FiFi−1si−1Fi−2si−2F_iF_{i-1}s_{i-1}F_{i-2}s_{i-2}Fi​Fi−1​si−1​Fi−2​si−2​ 有mmm个情况的sx!sx%ns_x!s_{…

Apache SkyWalking 为.NET Core带来开箱即用的分布式追踪和应用性能监控

在大型网站系统设计中&#xff0c;随着分布式架构&#xff0c;特别是微服务架构的流行&#xff0c;我们将系统解耦成更小的单元&#xff0c;通过不断的添加新的、小的模块或者重用已经有的模块来构建复杂的系统。随着模块的不断增多&#xff0c;一次请求可能会涉及到十几个甚至…

洛谷 P1967货车运输 并查集+贪心 不需要用LCA!

题目链接 题目链接 题解 要求所有的路径中最小边长的最大值&#xff01; 我们贪心的加边&#xff0c;依照边从大往小的方式往里添加&#xff0c;然后合并并查集。 每次当查询分布在两个待合并的并查集的时候&#xff0c;当前的边长就是这次查询的答案。 我们对每个并查集…

【图论】【最短路】【SPFA】香甜的黄油 Sweet Butter (luogu 1828)

香甜的黄油 Sweet Butter luogu 1828 题目大意&#xff1a; 有n头奶牛&#xff0c;他们在不同的牧场中&#xff0c;他们之间有一些路&#xff0c;现在要让他们去一个地方吃黄油&#xff0c;使他们的总距离最小 题目描述 农夫John发现做出全威斯康辛州最甜的黄油的方法&…

P1081 开车旅行 倍增 洛谷

题目连接 题意 题目已经说的hin明确了。 题解 我们要求出从每个点出发&#xff0c;小A要走的城市和小B要走的城市。 我们把ii以后的所有点的海拔加入到set" role="presentation" style="position: relative;">setset&#xff0c;然后拿H[i]H[…

nssl1454-最短路【并查集,贪心】

正题 题目大意 nnn个点&#xff0c;每个点可以走到[ai,n][a_i,n][ai​,n]&#xff0c;每个点可以从[bi,n][b_i,n][bi​,n]到达。 求disi,j∗(ij)dis_{i,j}*(ij)disi,j​∗(ij)的异或和 解题思路 首先我们可以知道肯定是先往后跳再往前走最优&#xff0c;因为如果先往前再往后…

.NET Core 跨平台执行命令、脚本

一.前言我们可能会遇到需要在程序中执行一些系统命令&#xff0c;来获取一些信息&#xff1b;或者调用shell脚本。.NET Core 目前已经可以跨平台执行&#xff0c;那么它如何跨平台执行命令呢&#xff0c;请看下面的讲解。二.ProcessStartInfo、Process 类介绍我们主要用到的两个…