2.数字对

【题目描述】

小H是个善于思考的学生,现在她又在思考一个有关序列的问题。

她的面前浮现出一个长度为n的序列{ai},她想找出一段区间[L, R](1 <= L <= R <= n)。

这个特殊区间满足,存在一个k(L <= k <= R),并且对于任意的i(L <= i <= R),ai都能被ak整除。这样的一个特殊区间 [L, R]价值为R - L。

小H想知道序列中所有特殊区间的最大价值是多少,而有多少个这样的区间呢?这些区间又分别是哪些呢?你能帮助她吧。

【输入格式】

第一行,一个整数n.

第二行,n个整数,代表ai.

【输出格式】

第一行两个整数,num和val,表示价值最大的特殊区间的个数以及最大价值。

第二行num个整数,按升序输出每个价值最大的特殊区间的L.

【样例输入1】

5

4 6 9 3 6

【样例输出1】

1 3

2

【样例输入2】

5

2 3 5 7 11

【样例输出2】

5 0

1 2 3 4 5

【数据范围】

30%: 1 <= n <= 30 , 1 <= ai <= 32.

60%: 1 <= n <= 3000 , 1 <= ai <= 1024.

80%: 1 <= n <= 300000 , 1 <= ai <= 1048576.

100%: 1 <= n <= 500000 , 1 <= ai < 2 ^ 31.

/*
暴力.
复杂度n*ans左右.
竟然能过.
But But But
我没想到区间判重然后爆零orz.
区间的话只判一维就好.
因为在该ans下左端点只会出现一次.
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<map>
#define MAXN 500001
#define LL long long
using namespace std;
int s[MAXN],n,m,cut,ans,tot,a[MAXN];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void slove()
{
for(int i=1;i<=n;i++)
{
int l=1,r=n;
for(int j=i;j>=1;j--)
if(a[j]%a[i]!=0){l=j+1;break;}
for(int j=i;j<=n;j++)
if(a[j]%a[i]!=0){r=j-1 ;break;}
if(r-l==ans) s[++tot]=l;
if(r-l>ans)
{
ans=r-l;
tot=0;
s[++tot]=l;
}
}
tot=unique(s+1,s+tot+1)-s-1;
printf("%d %d\n",tot,ans);
for(int i=1;i<=tot;i++)
printf("%d ",s[i]);
}
int main()
{
freopen("pair.in","r",stdin);
freopen("pair.out","w",stdout);
int x,y;
n=read();
for(int i=1;i<=n;i++) a[i]=read();
slove();
return 0;
}
/*
考试打到线段树维护就蒙蔽了.
然后树上各种乱判.
其实区间最小值等于区间gcd
就说明这个值在这个区间出现了.
二分一个ans 把区间降到nlogn个.
然后线段树log查询检验.
But 这题卡log 只能得60.
用ST表维护就好了.
*/
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 500001
#define LL long long
using namespace std;
int s[MAXN],n,m,cut,ans=-1,tot,tmp[MAXN];
struct data{int l,r,lc,rc,ans,min;bool b;}tree[MAXN*4];
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
int gcd(int x,int y)
{
if(!y) return x;
else gcd(y,x%y);
}
void Build(int l,int r)
{
int k=++cut;
tree[k].l=l,tree[k].r=r;
if(l==r){
tree[k].b=true;
tree[k].ans=read();
tree[k].min=tree[k].ans;
return ;
}
int mid=(l+r)>>1;
tree[k].lc=cut+1;
Build(l,mid);
tree[k].rc=cut+1;
Build(mid+1,r);
tree[k].ans=gcd(tree[tree[k].lc].ans,tree[tree[k].rc].ans);
tree[k].min=min(tree[tree[k].lc].min,tree[tree[k].rc].min);
}
int querygcd(int k,int l,int r)
{
if(l<=tree[k].l&&tree[k].r<=r) return tree[k].ans;
int tot1=0,tot2=0,mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) tot1=querygcd(tree[k].lc,l,r);
if(r>mid) tot2=querygcd(tree[k].rc,l,r);
if(tot1&&tot2) return gcd(tot1,tot2);
if(tot1) return tot1;
if(tot2) return tot2;
}
int querymin(int k,int l,int r)
{
if(l<=tree[k].l&&tree[k].r<=r) return tree[k].min;
int tot1=1e9,mid=(tree[k].l+tree[k].r)>>1;
if(l<=mid) tot1=min(tot1,querymin(tree[k].lc,l,r));
if(r>mid) tot1=min(tot1,querymin(tree[k].rc,l,r));
return tot1;
}
bool check(int x)
{
bool flag=false;int total=0;
for(int i=1;i<=n;i++) tmp[i]=0;
for(int i=1;i<=n-x;i++)
{
if(querymin(1,i,i+x)==querygcd(1,i,i+x))
{
tmp[++total]=i;flag=true;
}
}
if(flag&&ans<x)
{
tot=total;
for(int i=1;i<=tot;i++) s[i]=tmp[i];
ans=x;return true;
}
return false;
}
void erfen(int l,int r)
{
int mid;
while(l<=r)
{
mid=(l+r)>>1;
if(check(mid)) ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d %d\n",tot,ans);
for(int i=1;i<=tot;i++)
printf("%d ",s[i]);
}
int main()
{
freopen("pair.in","r",stdin);
freopen("pair.out","w",stdout);
int x,y;
n=read();
Build(1,n);
erfen(0,n);
return 0;
}

Noip 模拟题 T2 数字对的更多相关文章

  1. 2018.10.30 NOIp模拟赛T2 数字对

    [题目描述] 小 H 是个善于思考的学生,现在她又在思考一个有关序列的问题.        她的面前浮现出一个长度为 n 的序列{ai},她想找出一段区间[L, R](1 <= L <= ...

  2. NOIP模拟题汇总(加厚版)

    \(NOIP\)模拟题汇总(加厚版) T1 string 描述 有一个仅由 '0' 和 '1' 组成的字符串 \(A\),可以对其执行下列两个操作: 删除 \(A\)中的第一个字符: 若 \(A\)中 ...

  3. 8.22 NOIP 模拟题

      8.22 NOIP 模拟题 编译命令 g++ -o * *.cpp gcc -o * *.c fpc *.pas 编译器版本 g++/gcc fpc 评测环境 位 Linux, .3GHZ CPU ...

  4. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  5. 【入门OJ】2003: [Noip模拟题]寻找羔羊

    这里可以复制样例: 样例输入: agnusbgnus 样例输出: 6 这里是链接:[入门OJ]2003: [Noip模拟题]寻找羔羊 这里是题解: 题目是求子串个数,且要求简单去重. 对于一个例子(a ...

  6. NOIP模拟题17.9.26

    B 君的任务(task)[题目描述]与君初相识,犹如故人归.B 君看到了Z 君的第一题,觉得很难.于是自己出了一个简单题.你需要完成n 个任务,第i 任务有2 个属性ai; bi.其中ai 是完成这个 ...

  7. noip模拟6(T2更新

    由于蒟弱目前还没调出T1和T2,所以先写T3和T4.(T1T2更完辣! update in 6.12 07:19 T3 大佬 题目描述: 他发现katarina大佬真是太强了,于是就学习了一下kata ...

  8. noip模拟题题解集

    最近做模拟题看到一些好的题及题解. 升格思想: 核电站问题 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 任务:对于给定 ...

  9. NOIP 模拟4 T2

    本题属于二和一问题 子问题相互对称 考虑对于问题一:知a求b 那么根据b数组定义式 显然能发现问题在于如何求dis(最短路) 有很多算法可供选择 dijsktra,floyed,bfs/dfs,spf ...

随机推荐

  1. Java考题知识点

    挑战10个最难回答的Java面试题(附答案) - 里奥ii的文章 - 知乎 https://zhuanlan.zhihu.com/p/79186037 1.java的基本编程单元是类,基本存储单元是变 ...

  2. Python基础总结之第六天开始【先简单认识一次函数】(新手可相互督促)

    午休后,看看电视,在回顾下新的知识----函数.相信很多小伙伴在学习python后 ,学到函数就会有一部分人放弃了,从努力到放弃(内容过于真实) 好希望我也能有很多粉丝,hhh.... 函数: 什么是 ...

  3. 15.Ansible安装与配置简单版

    Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务. 一.Ansible工作机制 从图中可 ...

  4. C#字典转对象

    /// <summary> /// Assign parameters to specified objects /// </summary> /// <typepara ...

  5. 怎样修改 VS Code 主题?

    方法1. 点击左上角 File > Preferences > Color Theme. 方法2. 使用快捷键: Ctrl + K , Ctrl + T  PS: 查询各种操作的快捷键可以 ...

  6. mac 下 vscode配置SFTP连接

    VScode中使用SFTP插件连接远程服务器进行文件修改 下载SFTP插件后,使用Ctrl+Shift+P.输入SFTP,选择第一个将会生成简短的默认配置文件 然后把sftp.json文件内内容换成以 ...

  7. Java并发与多线程教程(2)

    Java同步块 Java 同步块(synchronized block)用来标记方法或者代码块是同步的.Java同步块用来避免竞争.本文介绍以下内容: Java同步关键字(synchronzied) ...

  8. Maven错误:警告Classpath entry org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER will not be exported or published

    该错误是在我将一个普通的由maven管理的java项目变为javaweb项目后出现的,由警告可以看出是说maven的类路径容器不会被导出或发布(即通过maven管理的依赖不会被导出或发布),那么我们用 ...

  9. 微信Emoji表情代码大全

    参考网址 因PC端微信表情包不全,部分表情在PC中有显示问题,手机端微信不存在此问题,或者可以使用文字[微笑]这种方式添加微信表情 含义 标准 DoCoMo KDDI 软银 谷歌 微信 ✂复制这列

  10. ASR测试方法---字错率(WER)、句错率(SER)统计

    一.基础概念 1.1.语音识别(ASR) 语音识别(speech recognition)技术,也被称为自动语音识别(英语:Automatic Speech Recognition, ASR), 狭隘 ...