原题链接:http://codeforces.com/problemset/problem/359/D

思路:首先对符合题目的长度(r-l)从0到n-1进行二分查找,对每一个长度进行check,看是否满足条件。

满足条件的话需要区间【l,r】内的最小值和最大公约数相等,如果暴力搜索,会超时,故采用st(sparse table)算法,建立table只需要O(nlgn)时间,查询是O(1),远远小于暴力搜索

st算法具体可参考http://baike.baidu.com/view/1536346.htm#2,只要适用于一段区间内的最大最小等值的计算。

AC代码如下:

#include <iostream>
#include <cstdio>
#include <iomanip>
#include <algorithm>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <string.h>
#include <math.h>
using namespace std;
typedef long long ll;
const int MAXN = 300050;
int arr[MAXN];
int dp[MAXN][20];//gcd
int dq[MAXN][20];//min
int n;
int gcd(int a,int b)
{
return b?gcd(b,a%b):a;
}
bool ok(int x)
{
int k = (int)(log((double)(x+1)) / log(2.0));
for(int i=0;i<n-x;i++)
{
int j = i+x; int Min = min(dq[i][k],dq[j - (1<<k) + 1][k]);
int g = gcd(dp[i][k],dp[j - (1<<k) + 1][k]);
if(g==Min)
return true;
}
return false;
}
void out(int x)
{
vector<int> v;
int k = (int)(log((double)(x+1)) / log(2.0));
if(x>0)
{
for(int i=0;i<n-x;i++)
{
int j = i+x;
int Min = min(dq[i][k],dq[j - (1<<k) + 1][k]);
int g = gcd(dp[i][k],dp[j - (1<<k) + 1][k]);
if(g==Min)
{
v.push_back(i);
}
}
}
else
{
for(int i=0;i<n;i++)
v.push_back(i);
}
cout<<v.size()<<" "<<( x>0?x:0)<<endl;
for(int i=0;i<v.size();i++)
cout<<v[i]+1<<" ";
cout<<endl;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
cin>>arr[i];
for(int i=0;i<n;i++)
{
dp[i][0] = arr[i];
dq[i][0] = arr[i];
}
for(int i=1;i<20;i++)
for(int j = 0;j<n;j++)
{
dp[j][i]=dp[j-1][i];
dq[j][i] = dq[j-1][i];
if(j+(1<<(i-1))<n)
{
dq[j][i] = min(dq[j][i-1],dq[j+(1<<(i-1))][i-1]);
dp[j][i] = gcd(dp[j][i-1],dp[j+(1<<(i-1))][i-1]);
} } int l = 0;int r = n-1;
while(l<r)
{
int mid = (l+r+1)/2;
if(ok(mid))
l = mid;
else
r = mid-1;
} out(l);
return 0;
}

codeforce 359D 二分+ 动态规划(sparse table)的更多相关文章

  1. RMQ ---- ST(Sparse Table)算法

    [概述]      RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返 ...

  2. 一维二维Sparse Table

    写在前面: 记录了个人的学习过程,同时方便复习 Sparse Table 有些情况,需要反复读取某个指定范围内的值而不需要修改 逐个判断区间内的每个值显然太浪费时间 我们希望用空间换取时间 ST表就是 ...

  3. RMQ(ST(Sparse Table))(转载)

    1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...

  4. 二分+动态规划 POJ 1973 Software Company

    Software Company Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 1112   Accepted: 482 D ...

  5. codeforces 359D 二分答案+RMQ

    上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{ ...

  6. codeforce 626E(二分)

    E. Simple Skewness time limit per test 3 seconds memory limit per test 256 megabytes input standard ...

  7. 【HDU 5808】 Price List Strike Back (整体二分+动态规划)

    Price List Strike Back There are nn shops numbered with successive integers from 11 to nn in Bytelan ...

  8. BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)

    dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...

  9. 【洛谷P1281 书的复制】二分+动态规划

    分析 两个做法,一个DP,一个是二分. 二分:也就是二分枚举每个人分到的东西. DP:区间DP F[I][J]表示前i本书分给j个人用的最短时间 由于每一次j的状态由比j小的状态得出,所以要先枚举j, ...

随机推荐

  1. dedecms代码研究六

    今天讲的是dedecms最关键的东西,模板分析啦.也就是dedetag.class.php 里面的ParseTemplet方法 模板解析方法 先看看一个dedecms标签,大家心里有个数: {dede ...

  2. mssql 动态行转列。

    )) ,'张三' ,'李四' ,'王五' select * from #a a b ----------- ---- 张三 李四 王五 ( 行受影响) --行转列,步骤:''+张三+],[+王五+], ...

  3. 判断 0 和 '' 以及 empty null false的关系

    if('safdasefasefasf'==0) { echo "该字符串转换为数字 等于 0 <br/>"; } //output:该字符串转换为数字 等于零. 这是 ...

  4. SQL Server常用技巧

    1:在SQL语句中,将存储过程结果集(表)存入到临时表中 insert into #tmp EXEC P_GET_AllChildrenComany '80047' 说明:#tmp要提前创建好 2:字 ...

  5. mysql错误用法insert into where

    mysql中给表中插入数据,一般使用insert into. 但是在插入数据时,有时会根据条件来插入数据,比如insert into t_person(num,name) values(1,'lily ...

  6. CentOS6 vsftpd 安装及优化方法

    我在每次配置ftp的时候都会一头雾水,一直也没总结一份特别完整有效的方法出来,这次特别记录一下,以备以后使用 1.安装vsftpd yum -y install vsftpd chkconfig vs ...

  7. dockerfile学习与详解

    1,什么是dockerfile? dockerfile是相当于docker使用的一个脚本,作用是便于实现自定义的镜像image,用语docker build [OPTIONS] PATH ,只需要指定 ...

  8. c 数据拼接

    char buf1[] = {0x31,0x32,0x33,0x00,0x51,0x52,0x53,0xaa,0xbb,0xcc,0x00}; int a=0xabcd6799; int b=0x88 ...

  9. 搭建java,oracle,plsql开发环境

    一:安装jdk和jre; (1)有两种方法:1,从官网网址上安装:2,安装绿色版 (2)配置环境变量 在"系统变量"下进行如下配置: (1)新建->变量名:JAVA_HOME ...

  10. 7.Mybatis关联表查询(这里主要讲的是一对一和一对多的关联查询)

    在Mybatis中的管理表查询这里主要介绍的是一对一和一对多的关联查询的resultMap的管理配置查询,当然你也可以用包装类来实现.不过这里不说,做关联查询的步骤可以简单的总结为以下的几步: 1.分 ...