博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU5320 : Fan Li
阅读量:5982 次
发布时间:2019-06-20

本文共 2042 字,大约阅读时间需要 6 分钟。

考虑枚举左端点i,则随着右端点的右移,一共只有$O(\log n)$种不同的gcd取值。所以首先通过ST表+二分查找预处理出$O(n\log n)$个四元组(x,i,l,r),表示左端点为i,右端点取值范围在[l,r]内,且这一段的gcd都为x。

将四元组按照x为第一关键字,i为第二关键字排序,对于相同的x一起处理。

当x相同时,显然所有的i互不相同。设f[i]为恰好以位置i为结尾的最优解,则对于一个四元组(x,i,l,r),能更新它的最优解为区间[1,i-1]的最优值+1,然后用它更新区间[l,r]的f[]。用支持打标记的线段树维护即可。时间复杂度$O(n\log^2n)$。

比赛的时候TLE不止,赛后什么都没改交了一发居然直接就过了。

 

#include
#include
#include
using namespace std;const int N=100010,K=17,P=998244353,M=262145;int T,n,m,i,j,x,y,l,r,mid,Log[N],val,f[K][N];struct PI{ int x,i,l,r; PI(){} PI(int _x,int _i,int _l,int _r){x=_x,i=_i,l=_l,r=_r;}}a[3000000];inline bool cmp(PI a,PI b){return a.x==b.x?a.i
b.x)return Num(x,y); return Num(x,(y+b.y)%P); } inline Num operator+(int _x){return Num(x+_x,y);} inline Num operator-(int b){return Num(x,(long long)y*b%P);} inline void operator+=(Num b){*this=*this+b;}}tmp,v[M],tag[M],ans;int pos[M];inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10LL)+=c-'0';}inline int askgcd(int y){int k=Log[y-i+1];return __gcd(f[k][i],f[k][y-(1<
>1; if(c<=mid)change(x<<1,a,mid,c,d); if(d>mid)change(x<<1|1,mid+1,b,c,d); up(x);}void ask(int x,int a,int b,int c,int d){ clean(x); if(c<=a&&b<=d){tmp+=v[x];return;} pb(x); int mid=(a+b)>>1; if(c<=mid)ask(x<<1,a,mid,c,d); if(d>mid)ask(x<<1|1,mid+1,b,c,d); up(x);}int main(){ for(i=2;i<=100000;i++)Log[i]=Log[i>>1]+1; while(~scanf("%d",&n)){ m=0; ans=Num(); for(i=1;i<=n;i++)read(f[0][i]); int flag=0; for(i=2;i<=n;i++)if(f[0][i]!=f[0][i-1]){flag=1;break;} if(!flag){printf("%d 1\n",n);continue;} for(j=1;j
<
<=n;i++)f[j][i]=__gcd(f[j-1][i],f[j-1][i+(1<
>1)==val)l=(y=mid)+1;else r=mid-1; a[++m]=PI(val,i,x,y); } sort(a+1,a+m+1,cmp); for(i=1;i<=m;i++){ if(i==1||a[i].x!=a[i-1].x)T++; tmp=Num(); if(a[i].i>1)ask(1,1,n,1,a[i].i-1); if(!tmp.x)tmp=Num(1,1);else tmp.x++; ans+=tmp-(a[i].r-a[i].l+1); change(1,1,n,a[i].l,a[i].r); } printf("%d %d\n",ans.x,ans.y); } return 0;}

  

转载地址:http://jqeox.baihongyu.com/

你可能感兴趣的文章
第五周作业
查看>>
支付宝登录接口解析
查看>>
C#队列Queue实现一个简单的电商网站秒杀程序
查看>>
OpenStack 镜像制作
查看>>
FreeMarker标签出错问题
查看>>
添加机构organizations模块
查看>>
ECharts开源图表使用方法简单介绍
查看>>
nose框架命令与特点
查看>>
笔试题:发奖金(搜狐2016研发笔试题)
查看>>
cdoj 1485 柱爷搞子串 sam treap
查看>>
OpenJDK 源码阅读之 Java 字节流输出类的实现
查看>>
Windows Socket Demo
查看>>
Eclipse 设置保存代码时自动格式化
查看>>
JavaEE(28) - {TODO}
查看>>
background:url 的使用方法
查看>>
jquery中的ajax
查看>>
pandas数据分析
查看>>
Redis学习笔记(2)-新建虚拟电脑,安装系统CentOSMini
查看>>
c++的map有关
查看>>
信息安全系统设计基础第六周学习总结
查看>>