【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子段. 设这个子段左端点 ...
随机推荐
- redis数据结构之SDS
简介 redis源码虽然是C语言实现的,但是Redis没有直接采用C语言传统的字符串表示,而是构建了一种名叫简单动态字符串(simple dynamic string,SDS)的抽象类型,并将SDS用 ...
- cocos2dx 3.9 微信授权登陆后游戏进程结束解决办法
找到 Cocos2dxActivity.java 文件夹 里面的 onDestroy() 方法 if (mGLSurfaceView != null) { Cocos2dxHel ...
- Mysql ibd恢复
一,binlog恢复,这里就不说了. 二,ibd方式其实很简单, 生成数据结构(有的可以跳过) 1,创建一个新库 2,新库里新建一个表,名字和回复的表一样. 字段数量一样(字段类型和名字都无所谓) 3 ...
- webstorm常见快捷方法与遇到的一些问题
1.动态添加标签快捷写法 例子:生成10个文字按顺序编号的class为task-item的div 2.win10下webstorm的terminal无法输入? 打开一个 cmd.exe,标题栏 右键 ...
- 2019 hdu多校1
A:一类线性dp,时间卡的有点紧 /* 定义 dp[t][i][j][k]代表填完前 t 个位置后,{0, 1, 2, 3} 这 4 个数字最后一次出现的位置, 排序后为 t, i, j, k(t & ...
- csp-s模拟测试94
csp-s模拟测试94 一场简单题,打爆了.$T1$脑抽分解质因数准备分子分母消,想了半天发现$jb$互质直接上天,果断码了高精滚蛋.$T2$无脑手玩大样例,突然灵光一闪想到映射到前$K$大小的区间, ...
- UIWindow & UIWindowLevel笔记
一.UIWindow是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面.UIWindow在程序中主要起到三个作用: 1.作为容器 ...
- python输入输出(二)
输出 >>> print(5) 5 >>> print(5*6) 30 >>> s1 = "hello" >>&g ...
- 剑指offer——24链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 题解: 1.普通解法,先遍历一遍计算链表长度,然后遍历到倒数第k个节点: 2.只遍历一遍,使用双指针,使得头尾指针位差为k,那么当尾指针为空时 ...
- -bash: make: command not found
yum -y install gcc automake autoconf libtool make