【题目描述】

小 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.


思路

可以想到所有特殊区间必定满足区间最小值等于区间GCD。于是可以使用ST表来维护这两个东西,最后二分求解。

目测0(nlogn)的复杂度,我觉得海星。

 #include <iostream>
#include <cstdio>
#include <cmath> using namespace std; #define MAXN 500005 int n;
int a[MAXN], ans[MAXN], _ans, g[MAXN][];
int minn[MAXN][]; int gcd(int a, int b) {
return b == ? a : gcd(b, a % b);
} bool query(int l, int r) {
int s = log2(r - l + );
return min(minn[l][s], minn[r - ( << s) + ][s]) == gcd(g[l][s], g[r - ( << s) + ][s]);
} bool judge(int lim) {
int tmp = _ans;
_ans = ;
for(int i = ; i <= n - lim; ++i)
if(query(i, i + lim))
ans[++_ans] = i;
if(_ans == )
return _ans = tmp, false;
return true;
} int main() {
freopen("pair.in", "r", stdin);
freopen("pair.out", "w", stdout); scanf("%d", &n); for(int i = ; i <= n; ++i) {
scanf("%d", &a[i]);
minn[i][] = g[i][] = a[i];
} for(int j = ; j <= ; ++j)
for(int i = ; i + ( << j) - <= n; ++i)
minn[i][j] = min(minn[i][j - ], minn[i + ( << (j - ))][j - ]),
g[i][j] = gcd(g[i][j - ], g[i + ( << (j - ))][j - ]); int l = , r = n, maxL;
while(l <= r) {
int mid = (l + r) >> ;
if(judge(mid))
l = mid + , maxL = mid;
else
r = mid - ;
} printf("%d %d\n", _ans, maxL);
for(int i = ; i <= _ans; ++i)
printf("%d ", ans[i]);
printf("\n"); fclose(stdin);
fclose(stdout); return ;
}

点击查看代码qwq

2018.10.30 NOIp模拟赛T2 数字对的更多相关文章

  1. 2018.10.30 NOIp模拟赛 T1 改造二叉树

    [题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...

  2. 2018.10.16 NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...

  3. 2016.10.30 NOIP模拟赛 day2 PM 整理

    满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...

  4. 2016.10.30 NOIP模拟赛 day2 AM 整理

    题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分  2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...

  5. 2018.10.03 NOIP+ 模拟赛 解题报告

    得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...

  6. 2018.02.12 noip模拟赛T2

    二兵的赌注 Description游戏中,二兵要进入了一家奇怪的赌场.赌场中有n个庄家,每个庄家都可以猜大猜小,猜一次一元钱.每一次开彩前,你都可以到任意个庄家那里下赌注.如果开彩结果是大,你就可以得 ...

  7. 2018.10.31 NOIP模拟 一串数字(数论+贪心)

    传送门 把每一个数aaa质因数分解. 假设a=p1a1∗p2a2∗...∗pkaka=p_1^{a_1}*p_2^{a_2}*...*p_k^{a_k}a=p1a1​​∗p2a2​​∗...∗pkak ...

  8. 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)

    传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...

  9. 2018.10.30 NOIP模拟 字胡串(单调栈+容斥)

    传送门 对于每个点,用单调栈求出它左右第一个比他大的位置. 然后对每个点O(logai)O(log_{a_i})O(logai​​)求出第一个拥有跟它不同二进制位的位置. 然后容斥一下就行了. 代码

随机推荐

  1. 在使用Vue的过程中安装包的区别

    一:全局包: 用在终端里面 你可以在任何目录下进行安装,安装好了全局包之后,全局包一般安装在 C:/program files/nodejs C:/用户/xxx/App Data/Roaming/np ...

  2. ng2学习--pipe使用

    We use our custom pipe the same way we use built-in pipes.(自定义Pipe和API里自带的Pipe使用方式一致) We must includ ...

  3. POJ 2891 Strange Way to Express Integers excrt/我真傻,真的

    我真傻,真的 我单知道这道题在(b-b1)%d!=0时要判无解,哪成想自己却没有读完这组后面的数据而直接break掉...qwqfk 当 $ x \equiv b_1 (  mod    a_1  ) ...

  4. BestCoder Round #86 1001

    链接http://acm.hdu.edu.cn/showproblem.php?pid=5804 题意:给你一些商店和他的商品价格,然后给你一个记账本,问你记大了就是1,否则是0 解法:模拟,注意测试 ...

  5. 读取properties和xml中配置文件的值

    五种方式让你在java中读取properties文件内容不再是难题 在java中读取properties和xml文件中的方法:https://www.cnblogs.com/ConfidentLiu/ ...

  6. 非递归遍历二叉树Java版的实现代码(没写层次遍历)

    直接上代码呵呵,里面有注解 package www.com.leetcode.specificProblem; import java.util.ArrayList; import java.util ...

  7. linux下WPS的使用

    WPS退出了wps for linux ,高版本的一直安装不上,低版本的原来在桌面都有图标,重装后安装位置不是很明显打开关闭不是很方便.并且也不利于在终端模式下使用.现简单总结一下wps的表格 文字 ...

  8. C. Glass Carving 正着做或者倒着做都可以

    http://codeforces.com/problemset/problem/527/C 这题总体思路就是,每画一条线,然后就找到x间距的最max值和y间距的最max值,相乘就是当前的ans 那么 ...

  9. Murano中的角色

    Application Publisher - An individual or company that publishes an application to an application cat ...

  10. jquery选中checkbox

    jquery选中checkbox: $(function(){ $("[value = bb]:checkbox").attr("checked", true) ...