2018.10.30 NOIp模拟赛T2 数字对
【题目描述】
小 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 数字对的更多相关文章
- 2018.10.30 NOIp模拟赛 T1 改造二叉树
[题目描述] 小Y在学树论时看到了有关二叉树的介绍:在计算机科学中,二叉树是每个结点最多有两个子结点的有序树.通常子结点被称作“左孩子”和“右孩子”.二叉树被用作二叉搜索树和二叉堆.随后他又和他人讨论 ...
- 2018.10.16 NOIP模拟赛解题报告
心路历程 预计得分:\(100 + 100 + 20 = 220\) 实际得分:\(100 + 100 + 30 = 230\) 辣鸡模拟赛.. T1T2都是一眼题,T3考验卡常数还只有一档暴力分. ...
- 2016.10.30 NOIP模拟赛 day2 PM 整理
满分:300分 直接全部爆零,真的是很坑啊! 10.30的题目+数据:链接:http://pan.baidu.com/s/1jHXLace 密码:i784 T1: 题目中的难点就是每次折叠的点可能应经 ...
- 2016.10.30 NOIP模拟赛 day2 AM 整理
题目+数据:链接:http://pan.baidu.com/s/1gfBg4h1 密码:ho7o 总共得了:130分, 1:100分 2:30分(只会这30分的暴力) 3:0(毫无思路) 虽然不高, ...
- 2018.10.03 NOIP+ 模拟赛 解题报告
得分: \(30+5+0=35\)(考得真不咋滴) \(T1\):奥义商店(点此看题面) 以为很简单,对着这题想了一个多小时,最后果断打了个暴力交了... ... 看完题解发现其实也不是很难. 对于\ ...
- 2018.02.12 noip模拟赛T2
二兵的赌注 Description游戏中,二兵要进入了一家奇怪的赌场.赌场中有n个庄家,每个庄家都可以猜大猜小,猜一次一元钱.每一次开彩前,你都可以到任意个庄家那里下赌注.如果开彩结果是大,你就可以得 ...
- 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 ...
- 2018.10.30 NOIP模拟 有环无向图(dijkstra+巧妙建图)
传送门 建图巧妙啊. 对于每个点的出边,我们将它们排序之后依次连边. 这样可以把O(m2)O(m^2)O(m2)的边数变成O(m)O(m)O(m)的了. 连的权值就是max(edgemax(edgem ...
- 2018.10.30 NOIP模拟 字胡串(单调栈+容斥)
传送门 对于每个点,用单调栈求出它左右第一个比他大的位置. 然后对每个点O(logai)O(log_{a_i})O(logai)求出第一个拥有跟它不同二进制位的位置. 然后容斥一下就行了. 代码
随机推荐
- [Leetcode]009.Palindrome Number
public class Solution { public boolean isPalindrome(int x) { if (x<0 || (x!=0 && x%10==0) ...
- 【ACM】棋盘覆盖 - 大数除
棋盘覆盖 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 在一个2k×2k(1<=k<=100)的棋盘中恰有一方格被覆盖,如图1(k=2时),现用一缺角的 ...
- python入门之paramiko模块
paramiko用于实现ssh远程连接服务器执行相关操作. paramiko与之依赖模块cryptography最好版本相同,不然可能执行程序会出错. 一.ssh连接服务器执行命令 import pa ...
- springcloud中常用的注解@
@SpringBootApplication是springboot启动类,包括三个注解,他们的作用分别是: @Configuration:表示将该类作用springboot配置文件类 @EnableA ...
- Git bash 生产 ssh key
ssh-keygen -t rsa -C "youremail@example.com"
- Java面向对象_适配器模式
概念:将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作 public class Practice14 { public static v ...
- Shell笔试题3
1.查找当前目录中所有大于500M的文件,把这些文件名写到一个文本文件中,并统计其个数.find ./ -size +500M -type f | tee file_list | wc -l 2.在目 ...
- case 范围取值
你可以在单个case标签中指定一系列连续的值,就像这样: case low ... high: 这和单独的case标签的合适数字有同样的效果,每个对应包含在从low到high中的一个整数值. 这个 ...
- 白话SpringCloud | 第二章:服务注册与发现(Eureka)-上
前言 从本章节开始,正式进入SpringCloud的基础教程.从第一章<什么是SpringCloud>中我们可以知道,一个微服务框架覆盖的东西是很多的,而如何去管理这些服务或者说API接口 ...
- MS Chart 条状图【转】
private void Form1_Load(object sender, EventArgs e) { string sql1 = "select 类别,coun ...