GCD + st表 + 二分

Problem - 1632D - Codeforces

题意

给出一个长度为 \(n\;(1<=n<=2*10^5)\) 的数组 \(a[i]\;(1<=a[i]<=10^9)\), 可以修改任何一个位置的数为任何一个正整数,对于任意一段区间 \([l,r]\;(1<=l<=r<=n)\),不能出现 \(gcd(a[l],a[l+1],...,a[r])=r-l+1\)

对于每个 \(i(1<=i<=n)\) , 求把前 i 个数组成的数组修改好的最小操作次数

思路

  1. 每次最优的修改是把当前的数改为一个极大的质数,这样包含这个数的区间肯定都是合法的

  2. 记上一次修改的位置是 L,对于每一个右端点 r,从 L + 1 到 r 枚举左端点,逐个判断 \([l,r]\) 是否合法,有不合法的就把 \(a[r]\) 改为大质数并更新 L

  3. 上述策略是 \(O(n^2)\) 的,但固定右端点,枚举左端点的过程是有单调性的,因为随着区间长度变小,区间gcd变大,因此可以二分找到

    区间gcd == 区间长度的位置

  4. 区间gcd用st表预处理出

#include <bits/stdc++.h>
using namespace std;
#define endl "\n" typedef long long ll;
typedef pair<int, int> PII; const int N = 2e5 + 10;
int n;
int a[N];
template<typename T> struct ST
{
ST(T a[], int n){
siz = n;
g.resize(n+1);
int t = __lg(n) + 1;
for(int i=1;i<=n;i++) g[i].resize(t); for(int i = 1; i <= n; i++) g[i][0] = a[i];
for(int j = 1; j < t; j++)
{
for(int i = 1; i <= n - (1<<j)+1; i++)
{
g[i][j] = __gcd(g[i][j-1], g[i+(1 << (j-1))][j-1]);
}
}
}
T get_gcd(int l,int r)
{
int k = __lg(r-l+1);
return __gcd(g[l][k], g[r-(1<<k)+1][k]);
}
private:
int siz = 0;
vector<vector<T>> g;
}; int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
ST<int> st(a, n);
int cnt = 0;
int L = 0;
for (int i = 1; i <= n; i++)
{
int l = L, r = i;
while(l + 1 != r)
{
int mid = l + r >> 1;
if (st.get_gcd(mid, i) >= i - mid + 1)
r = mid;
else
l = mid;
}
int tmp = st.get_gcd(r, i);
if (tmp == i - r + 1)
{
cnt++;
L = i;
}
cout << cnt << " ";
}
cout << endl;
return 0;
}

Codeforces Round #769 (Div. 2) - D. New Year Concert的更多相关文章

  1. Codeforces Round #769 (Div. 2)D,E

    D.New Year Concert 传送门 题目大意: 一个长为 N ( 1 ≤ N ≤ 2 × 1 0 5 ) N(1\leq N\leq2\times 10^5) N(1≤N≤2×105)的序列 ...

  2. Codeforces Round #366 (Div. 2) ABC

    Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...

  3. Codeforces Round #354 (Div. 2) ABCD

    Codeforces Round #354 (Div. 2) Problems     # Name     A Nicholas and Permutation standard input/out ...

  4. Codeforces Round #368 (Div. 2)

    直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...

  5. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  6. Codeforces Round #279 (Div. 2) ABCDE

    Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems     # Name     A Team Olympiad standard input/outpu ...

  7. Codeforces Round #262 (Div. 2) 1003

    Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...

  8. Codeforces Round #262 (Div. 2) 1004

    Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...

  9. Codeforces Round #371 (Div. 1)

    A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...

  10. Codeforces Round #268 (Div. 2) ABCD

    CF469 Codeforces Round #268 (Div. 2) http://codeforces.com/contest/469 开学了,时间少,水题就不写题解了,不水的题也不写这么详细了 ...

随机推荐

  1. SAP MD04屏幕显示增强

    需求 在看物料MRP结果的时候,业务人员想要看到工单批次,工单批次是我们这边工单下达后传输到其他系统,然后由其他系统回传回来的. 开发步骤 主要使用二代增强出口:M61X0002 创建增强项目 事务码 ...

  2. Maven项目中配置文件资源导出问题

    标准的Maven项目都会有一个resources目录来存放我们所有的资源配置文件,但是我们往往在项目中不会把所有的资源配置文件都放在resources文件夹中,我们有可能放在项目中的其他位置,那么默认 ...

  3. vue3中读取本地excel文件内容

    背景 做后台项目时避免不了excel文件上传,有的还要求对文件内容做校验,或者把文件内容转成数据上传保存. 操作 1.引入xlsx插件,最好安装指定版本,否则会报错 npm i xlsx@0.16.0 ...

  4. python官方文档:https://pypi.org/

    https://pypi.org/ Find, install and publish Python packages with the Python Package Index

  5. case语法案例

    case语法案例 制作nginx启停脚本 1.条件: 2.思路: 3.脚本 添加删除openvppn用户的脚本 1.实现要求 2.具体脚本 case语法案例 制作nginx启停脚本 1.条件: 启动服 ...

  6. 解决gpg: 从公钥服务器接收失败:服务器故障

    xxx@xxx-virtual-machine:~/workspace/rv1126_rv1109_sdk$ sudo apt-key adv --keyserver hkp://keyserver. ...

  7. hyper给linux扩容空间

    1.hyper操作 (1)关机后,在设置中,查看硬盘驱动器中的虚拟磁盘及编号, (2)编辑磁盘->查找磁盘中选中刚才的编号磁盘 (3)操作时扩容(大小填的不是增量 ,是扩容以后的空间) 2.li ...

  8. docker容器部署flask单页面应用

    本地安装docker,拉取centos镜像. docker pull centos:7 本地文件结构: /usr/local/var/tmp/docker_demo .app ---requireme ...

  9. Oralyzer-20220205

    Usage: oralyzer.py [-h] [-u URL] [-l PATH] [-crlf] [-p PAYLOAD] [--proxy] [--wayback] 可选参数: -h, --he ...

  10. Metasploit渗透测试框架二

    Metasploit基本使用方法 Metasploit基本命令 Metasploit程序需要使用Postgresql数据库. Postgresql是一种特性齐全的自由软件的对象-关系型数据库管理系统( ...