• 好数组——尺取法


    好数组

    给定一个长度为 n 的数组 a,计算数组 a 中所有子数组中好数组的数目。

    数组定义如下:

    对于数组 al ,al+1, ⋯ ,ar ,若数组中所有数的质因数种类数不超过 k,则称为好数组。

    Input

    输入的第一行包含两个正整数 n,k (1≤k≤n≤10^5)

    输入的第二行包含 n 个正整数 ai(1≤ ai ≤100)

    Output

    输出数组 

    a 中所有子数组中好数组的数目。

    样例输入

    4 2
    2 6 5 15


    样例输出

    样例:

    对于所有子数组:

    [2]
    [2,6]
    [2,6,5]
    [2,6,5,15]
    [6]
    [6,5]
    [6,5,15]
    [5]
    [5,15]
    [15]

    k=2,所以除了 [2,6,5],[2,6,5,15],[6,5,15],[6,5] 这四个子数组其他都是符合的。

    解析:

    尺取法:像尺子一样取一段,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以说尺取法是一种高效的枚举区间的方法。

    1. #include <bits/stdc++.h>
    2. using namespace std;
    3. #define ios ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    4. #define int long long
    5. priority_queue<int,vector<int>,greater<int>> ll;
    6. priority_queue<int> rr;
    7. typedef pair<int,int> PII;
    8. const int N=1e5+10;
    9. int n,k;
    10. vector <int> prime[N];
    11. int a[N];
    12. map <int,int> q;
    13. void get_prime(int n)
    14. {
    15. int m=n;
    16. for (int i=2;i<=n/i;i++)
    17. {
    18. if (n%i==0)
    19. {
    20. prime[m].push_back(i);
    21. while (n%i==0) n /=i;
    22. }
    23. }
    24. if (n>1) prime[m].push_back(n);
    25. }
    26. signed main()
    27. {
    28. ios;
    29. cin>>n>>k;
    30. for (int i=1;i<=n;i++)
    31. {
    32. cin>>a[i];
    33. if (prime[a[i]].size()==0) get_prime(a[i]);
    34. }
    35. int cnt=0;
    36. for (int r=1,l=1;r<=n;r++)
    37. {
    38. for (int i=0;i<prime[a[r]].size();i++) q[prime[a[r]][i]]++;
    39. while (q.size()>k) //当种类数大于 k 时,就从当前 l 开始,减去a[l]的质数,直到种类数小于等于 k 为止
    40. {
    41. for (int i=0;i<prime[a[l]].size();i++)
    42. {
    43. q[prime[a[l]][i]]--;
    44. if (q[prime[a[l]][i]]==0) q.erase(prime[a[l]][i]);
    45. }
    46. l++;
    47. }
    48. cnt +=r-l+1;
    49. }
    50. cout<<cnt;
    51. return 0;
    52. }

  • 相关阅读:
    PostgreSQL数据库限制
    xbox game bar无法打开/安装怎么办?
    huggingface/transformers 用Trainer 和 不用Trainer
    vue循环语句v-for中元素绑定值问题
    百度、四维图新、高德争“鲜”恐后
    Docker-compose详解和LNMP搭建实战
    【我的前端】面向 JavaScript 开发:前端必学的4种函数式编程技术
    如果PLC-Recorder的USBKEY丢失了,能否挂失,锁定?
    LeetCode(力扣)435. 无重叠区间Python
    容器服务(三)自动化监控 Prometheus、Grafana
  • 原文地址:https://blog.csdn.net/m0_74403543/article/details/134080069