codeforce 359D 二分+ 动态规划(sparse table)
原题链接: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)的更多相关文章
- RMQ ---- ST(Sparse Table)算法
[概述] RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返 ...
- 一维二维Sparse Table
写在前面: 记录了个人的学习过程,同时方便复习 Sparse Table 有些情况,需要反复读取某个指定范围内的值而不需要修改 逐个判断区间内的每个值显然太浪费时间 我们希望用空间换取时间 ST表就是 ...
- RMQ(ST(Sparse Table))(转载)
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A ...
- 二分+动态规划 POJ 1973 Software Company
Software Company Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 1112 Accepted: 482 D ...
- codeforces 359D 二分答案+RMQ
上学期刷过裸的RMQ模板题,不过那时候一直不理解>_< 其实RMQ很简单: 设f[i][j]表示从i开始的,长度为2^j的一段元素中的最小值or最大值 那么f[i][j]=min/max{ ...
- codeforce 626E(二分)
E. Simple Skewness time limit per test 3 seconds memory limit per test 256 megabytes input standard ...
- 【HDU 5808】 Price List Strike Back (整体二分+动态规划)
Price List Strike Back There are nn shops numbered with successive integers from 11 to nn in Bytelan ...
- BZOJ2151 种树(贪心+堆+链表/wqs二分+动态规划)
dp容易想到,但没法进一步优化了. 考虑贪心,每次选出价值最大的物品.但这显然是不对的因为会影响其他物品的选择. 于是考虑加上反悔操作.每次选出一个物品后,将其相邻两物品删除,再将原物品价值变为相邻两 ...
- 【洛谷P1281 书的复制】二分+动态规划
分析 两个做法,一个DP,一个是二分. 二分:也就是二分枚举每个人分到的东西. DP:区间DP F[I][J]表示前i本书分给j个人用的最短时间 由于每一次j的状态由比j小的状态得出,所以要先枚举j, ...
随机推荐
- oracle中的查询语句(关于出库入库信息表,明细表,把捆包箱表,单位信息表的集中查询)
--查出所有现金中心的单位IDwith AllUnitas(select t.ORGANIZATIONID orgid,t.parentidfrom CDMS_ORGANIZATION t where ...
- weed-fs 压力测试
阅读<Weed-FS/杂草文件系统 小文件存储集群 安装 使用 测试>中提到weedfs的负载压力不是很好,在看过代码后进行了相应测试,未发现负载压力有何问题. weedfs mast ...
- ajax分页
html显示 <center> <div id="fyh"> <ul class="pagination" id="fy ...
- TinyXML:一个优秀的C++ XML解析器
//-------------------------------------------------------------------------------------------------- ...
- linux系统man命令用法和安装方法
Linux提供了丰富的帮助手册,当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可. Linux的man手册共有以下几个章节: 代號 代表內容 1 使用者在shell中可以操作的指令或可 ...
- sp_MSforeachtable使用方法
1)说明系统存储过程sp_MSforeachtable和sp_MSforeachdb,是微软提供的两个不公开的存储过程,从ms sql 6.5开始.存放在SQL Server的MASTER数据库中. ...
- UIImageView、UISlider、UISwitch、UIStepper、UISegmentControl
UIImageView——图像视图 作用:专门用来显示图片的控件 . 设置图像 [self.imageView setImage:[UIImage imageNamed:@"abc.png& ...
- LightOJ 1094 - Farthest Nodes in a Tree(树的直径)
http://acm.hust.edu.cn/vjudge/contest/121398#problem/H 不是特别理解,今天第一次碰到这种问题.给个链接看大神的解释吧 http://www.cnb ...
- Qrels supervision information以及document collection,如何划分为train、test,保证test中doc对于train来说是new document
简单的思想:转换为最小割问题 无向图的全局最小割算法:Stoer-Wagner算法 简介见:Wiki介绍得比较好并有源代码 最小割算法:http://blog.csdn.net/markpen/art ...
- [转] 在Linux平台使用mhVTL虚拟化磁带库
原文来自:LIUBINGLIN ---- http://blog.itpub.net/23135684/viewspace-1307626/ <在Linux平台安装mhVTL虚拟化磁带库> ...