【JZOJ6294】动态数点
description
analysis
这题出的失败在只卡正解不卡暴力
比较好想的方法是枚举约数,向两边二分,但是这个不满足二分性
首先用\(ST\)表维护区间的\(\gcd\),不用线段树,这样查询就是\(O(\log_2(\max_{i=1}^{n} a_i))\)
然后照上面的方法做就行了,枚举约数,向左右二分,判断区间\(\gcd\)是否等于当前约数
时间复杂度\(O(n\log_2n)\)乘\(32\)的常数,注意卡常比如预处理出\(\log\)的值
code
#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 500005
#define ll long long
#define reg register ll
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i)
using namespace std;
ll f[MAXN][20],g[MAXN];
ll a[MAXN],ans[MAXN],LOG[MAXN];
ll n,mx,tot,cnt;
inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
inline ll query_gcd(ll l,ll r)
{
ll k=LOG[r-l+1];
return gcd(f[l][k],f[r+1-(1<<k)][k]);
}
int main()
{
freopen("T2.in","r",stdin);
//freopen("point.in","r",stdin);
//freopen("point.out","w",stdout);
n=read(),LOG[0]=-1;
fo(i,1,n)a[i]=f[i][0]=read(),LOG[i]=LOG[i>>1]+1;
fo(j,1,LOG[n])fo(i,1,n+1-(1<<j))
f[i][j]=gcd(f[i][j-1],f[i+(1<<(j-1))][j-1]);
fo(i,1,n)
{
ll l=1,r=i,mid,tmp;
while (l<=r)
{
mid=(l+r)>>1;
query_gcd(mid,i)==a[i]?r=mid-1:l=mid+1;
}
tmp=l,l=i,r=n;
while (l<=r)
{
mid=(l+r)>>1;
query_gcd(i,mid)==a[i]?l=mid+1:r=mid-1;
}
if (r-tmp>mx){mx=r-tmp,ans[tot=1]=tmp;}
else if (r-tmp==mx)ans[++tot]=tmp;
}
sort(ans+1,ans+tot+1);ll i=1;
while (i<=tot)
{
g[++cnt]=ans[i];
while (ans[i]==ans[i+1] && i<=n)++i;
++i;
}
printf("%lld %lld\n",cnt,mx);
fo(i,1,cnt)printf("%lld ",g[i]);
return 0;
}
【JZOJ6294】动态数点的更多相关文章
- NOIp2018集训test-10-4/test-10-5 (联考四day1/day2)
这个day1稍微有点毒瘤吧?? DAY1 排列 以前总是把day1t1想太复杂了翻车,差不多往正解的方向想了一下感觉不可能这么复杂这可是noipday1t1啊一定有非常简单的方法然后翻车了?? 题目转 ...
- JZOJ 2020.10.6 提高B组反思
JZOJ 2020.10.6 提高B组反思 T1 NYG的动态数点 最简单的一题 很容易想到\(O(n)\)的做法 枚举最小的那个数,即\(a_k\) 然后向左和向右扩展 然后可以直接从右端点+1继续 ...
- bzoj3295: [Cqoi2011]动态逆序对 三维数点
为了便于考虑,把删除反序变为增加 于是就变成关于权值和位置和时间的三维数点 一波cdq一波树状数组教做人 (神TM需要longlong,80了一发) #include <bits/stdc++. ...
- hdu 5398 动态树LCT
GCD Tree Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- 动态 DP 学习笔记
不得不承认,去年提高组 D2T3 对动态 DP 起到了良好的普及效果. 动态 DP 主要用于解决一类问题.这类问题一般原本都是较为简单的树上 DP 问题,但是被套上了丧心病狂的修改点权的操作.举个例子 ...
- bzoj3262陌上花开 三维数点 cdq+树状数组
大早上的做了一道三维数点一道五位数点,神清气爽! 先给一维排序,变成一个奇怪的动态的二维数点(相当于有一个扫描面扫过去,导致一系列的加点和询问) 然后cdq分治,再变回静态,考虑前半段对后半段的影响 ...
- Ajax/Highcharts—动态图表
前面写过“Highcharts的用法总结”,当然了,在实际应用中,图表数据都是要从后台获取的,根据之前的使用,贴一些例子来分享学习. 首先,如果没有获取后台数据,又希望呈现一个动态图表的话,可以很轻易 ...
- 基于layui,Jquery 表格动态编辑 设置 编辑值为 int 或者 double 类型及默认值
首先先推荐大家在看这篇笔记时,阅读过我写的这篇 Layui表格编辑[不依赖Layui的动态table加载] 阅读过上面那篇笔记之后呢,才能更好的理解我现在所要说的这个东西 接下来废话不多说,上代码. ...
- 6.6 省选模拟赛 线段 二维数点问题 树套树 CDQ分治
LINK:线段 还是太菜了 没看出这道题真正的模型 我真是一个典型的没脑子选手. 考虑如何查询答案. 每次在一个线段x的状态被更改后 可以发现有影响的是 和x相连那段极长连续1子段. 设这个子段左端点 ...
随机推荐
- 8u ftp 可以连接但是无法获取目录的解决办法:无法打开传输通道。原因:由于...
来自: http://www.3566t.com/news/dlsn/1557906.html 状态: 正在取得目录列表... 命令: CWD xinghun 响应: 250 OK. Curre ...
- centos 时区设置初认识
由于一些需要,我租用了一个海外服务器,并开始了我的centos之旅. 由于之前一直用虚拟机,而且在国内,所以不需要考虑时区的问题,但是现在,这个服务器是在海外的,所以就必须考虑时区的问题了.更何况我的 ...
- 通过hint干掉笛卡尔积
Z_ZZZZZZZZ_BENE 大约有400万数据 修改前 SELECT xxxx FROM ( SELECT DISTINCT FIELD1_CONTENT FROM xxxxxxxx_LOG@ ...
- 使用PHP如何去除字符串结尾的字符
前言 在工作中遇到一个需求:一串字符串,如"迅雷官方下载"."快播5.0下载",需要去掉他们结尾的"官方下载"和"下载" ...
- Linux系统升级
查看centos版本的命令:uname -r 升级版本:yum -y upgrade 重启:reboot
- ES6 Sybol属性
Symbol: 概念:ES6中的添加了一种原始数据类型symbol(已有的原始数据类型:String, Number, boolean, null, undefined, 对象) 特点: 1.Symb ...
- Servlet(Server Applet) 详解
Java编写的服务器端程序.其主要功能在于交互式地浏览和修改数据,生成动态Web内容. Servlet的工作模式 客户端发送请求至服务器 服务器启动并调用Servlet,Servlet根据客户端请求生 ...
- 记一次为解决Python读取PDF文件的Shell操作
目录 一.背景 二.问题 三.解决 四.一顿分析及 Shell 操作 五.后续 一.背景 本想将 PDF 文件转换为 Word 文档,然后网上搜索了一下发现有挺多转换的软件.有的是免费的.收费,咱也不 ...
- Python获取房价信息和导出EXCEL
房价与生活息息相关,那么各地区房价情况和差别咋样呢? 可以打开网站或手机APP去查询一下,不过查看到的数据有限,很不过瘾~ 作为一个合格的程序员,要懂得用代码解决问题! 第一步:打开一个房产交易平台 ...
- NX-二次开发删除对象UF_OBJ_delete_object
NX9+VS2012 #include <uf.h> #include <uf_curve.h> #include <uf_obj.h> UF_initialize ...