寻找最美的你(select)

Time Limit:2000ms   Memory Limit:128MB

题目描述

LYK带着悲伤行走在黑暗里。寂穆的夜空没有星月的点缀,身旁的树木、房屋、万事万物连同你自己,都融于宇宙的虚无缥缈之中。黑暗,压抑、膨胀、严严实实包围整个世界,LYK害怕,彷徨,无奈。突然,眼前出现一扇窗,流漏出点点昏黄的灯光。LYK欣喜地奔去看,原来这里有n个数字,LYK深深地被它们吸引。

这个问题是这样的,如果一个区间[L,R]存在一个数ai,使得这个数是这个区间所有数的约数,那么[L,R]这段区间,是一段好区间。

现在,LYK想知道最长的好区间的长度是多少,并且它想知道最长的好区间具体的位置,如果有多个,从小到大输出它们的左端点。

输入格式(select.in)
第一行一个数n,表示有n个这样的数字。

第二行n个数ai。

输出格式(select.out)

第一行两个数sum,len。其中sum表示有sum个最长的好区间,len表示最长的好区间的长度。

第二行sum个数,从小到大输出,表示所有最长好区间的左端点。

输入样例

5

4 6 9 3 6

输出样例

1 4

2

样例解释:

有一个最长的好区间[2,5]。

数据范围

对于40%的数据n<=100。

对于60%的数据n<=3000。

对于80%的数据n<=30000。ai<=1000。

对于100%的数据1<=n<=300000,1<=ai<=1000000。ai以一定方式随机。

    去搜就行,但要看怎么搜才能不超时。

  从左向右枚举约数,向左向右搜,搜完后跳到r+1开始搜,这样时间复杂度就降下来了。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#include<math.h>
#include<vector>
using namespace std;
int n,a[300009];
int l,r;
int len,cnt,ll[99599];
int main()
{
    freopen("select.in","r",stdin);freopen("select.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
     for(int i=1;i<=n;i++)
     {
         for(l=i-1;l>=1;l--)    if(a[l]%a[i]!=0)    break;l++;
         for(r=i+1;r<=n;r++)    if(a[r]%a[i]!=0)    break;r--;
         if(r-l+1>len)    len=r-l+1,ll[cnt=1]=l;else
         if(r-l+1==len)    ll[++cnt]=l;
         i=r;
     }
    printf("%d %d\n",cnt,len);
    for(int i=1;i<=cnt;i++)
    printf("%d ",ll[i]);
    return 0;
}
时间: 2024-11-03 21:28:50

寻找最美的你(select)的相关文章

sql

use simulation; # 多条SQL语句必须以分号分隔 show DATABASES ; show TABLES ; show COLUMNS from customers; # SQL语句不区分大小写 SHOW COLUMNS FROM products; SHOW COLUMNS FROM vendors; SHOW COLUMNS FROM orders; SHOW COLUMNS FROM productnotes; SHOW COLUMNS FROM orderitems;

一学期积累下来的SQL语句写法的学习

整合了一下上学期学习的积累,希望可以帮到初学者! 可能以后会有用吧! A 基本语句的运用 操作基于emp表1.按工资从高到低排列SQL> select rownum as 次序,ename,sal  2  from (select ename,sal  3  from emp  4  order by sal desc)  5  where rownum<=5  6  ;2.做内嵌式图由大到小排序后找前五个的错误写法 SQL> select ename,sal  2  from emp 

单行函数的案例

select * from scott.emp; select ename "name"from scott.emp; --lower转化小写的用法 select lower(ename) ename ,sal from scott.emp; select * from scott.emp where lower(ename)='allen'; --upper 转化大写 select upper(ename) "ename" from scott.emp ; --I

orcle 11g select count(*) from v$lock 引起的思索

<strong>最近发现orcle 11g select count(*) from v$lock 查询很慢,觉得有必要进行详细的分析::</strong> select count(*) from v$lock; -------------------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%

如何提高SELECT的效率

首先避免使用in ,not in,<>,<,<=,>,>=,is null,is not null 主要搜索字段建立索引 1.WHERE子句中的连接顺序 sql解析器采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在子句的末尾 SELECT … FROM emp e WHERE sal>50000 AND job=‘MANAGER’AND 25<(SELECT COUNT(

Intel 寻找热点

Lab 1: Finding Hotspots ___________________________________________________________________ Developer Product Division 寻找热点 Disclaimer The information contained in this document is provided for informational purposes only and represents the current v

select模型的原理、优点、缺点

关于I/O多路复用: I/O多路复用(又被称为“事件驱动”),首先要理解的是,操作系统为你提供了一个功能,当你的某个socket可读或者可写的时候,它可以给你一 个通知.这样当配合非阻塞的socket使用时,只有当系统通知我哪个描述符可读了,我才去执行read操作,可以保证每次read都能读到有效数据而不 做纯返回-1和EAGAIN的无用功.写操作类似.操作系统的这个功能通过select/poll/epoll之类的系统调用来实现,这些函数都可以同时 监视多个描述符的读写就绪状况,这样,**多个描

SELECT 场 FROM 表 WHERE 字段 Like 条件

间有关的条件,SQL它提供了四种匹配模式: 1.%: 表示随意0个或多个字符.可匹配随意类型和长度的字符.有些情况下若是中文,请使用两个百分号(%%)表示. 比方 SELECT * FROM [user] WHERE u_name LIKE '%三%' 将会把u_name为"张三","张猫三"."三脚猫"."唐三藏"等等有"三"的记录全找出来. 另外,假设须要找出u_name中既有"三"

快速选择select算法

问题描述: 在一个数组中找出第k小的数. 算法: 快速选择select算法. 策略:五分化中项的中项做pivot 复杂度:最坏情况下O(n) 对比: 1.RANDOMIZED-SELECT,以序列中随机选取一个元素作为主元,可达到线性期望时间O(N)的复杂度. 2.SELECT,快速选择算法,以序列中"五分化中项的中项",或"中位数的中位数"作为主元(枢纽元),在最坏情况下亦为O(N)的复杂度. 代码实现: #pragma once #include<iost