CF1497E2 Square-free division (hard version)

题意:

数组 a 由 n 个正整数构成。你需要将它们分割成最小数量的连续子段,使得每一个子段中的任意两个数(不同位置)的乘积不为完全平方数。
除此之外,你被允许在分割之前进行最多 k 次修改操作。
在一次修改操作中,你可以选择数组中的某个位置的数,将该位置的数变为任意正整数。
请问连续子段的最小数量是多少(在最多 k 次操作后)?

题解:

本题多了修改操作,一开始部分和E1情况一样,还是先对数组a[]a[]a[]进行操作,将偶数质因子去掉,奇数质因子留下一个。
很明显要dp转移,如何转移?
先设dp[i][j]表示前i个数字修改了j的连续字段的最小数量
怎么转移呢?
单单考虑第i个是否修改貌似是不够的,一个思想是上一次划分到k,修改次数为p,则从dp[k][p]转移到dp[i][j]。对于[k+1,i]这一段,如果这一段的最小需要改变数量为num,那么就有p+num=j。
这样我们就需要知道任意一段[l,r]的最小修改次数
我们设l[i][k]:表示最小的pos使得[pos,i]作为一个整段时消耗了x从修改,为什么要这样设?这样可以极大的简化dp过程,对于一个k,不同的i,我们可以快速找到上一个状态j,从状态j转移到当前的状态i
转移方程:dp[i][j]=moin(dp[i][j],dp[l[i][x]][j−x]+1)dp[i][j]=moin(dp[i][j],dp[l[i][x]][j-x]+1)dp[i][j]=moin(dp[i][j],dp[l[i][x]][j−x]+1)
对于数组l[i][k]=j,对于一个确定的k,当i增加时,结果j必然单调不减,所以j我们可以利用双指针O(n)求,这样求l[][]数组的复杂度是O(nk)
dp复杂度是O(nk2)O(nk^2)O(nk2)

代码:

// Problem: E2. Square-free division (hard version)
// Contest: Codeforces Round #708 (Div. 2)
// URL: https://codeforces.com/contest/{getProblemIndexes(problemCurrentPageList[i][0])[0]}/problem/E2
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// By Jozky#include <bits/stdc++.h>
#include <unordered_map>
#define debug(a, b) printf("%s = %d\n", a, b);
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
clock_t startTime, endTime;
//Fe~Jozky
const ll INF_ll= 1e18;
const int INF_int= 0x3f3f3f3f;
void read(){};
template <typename _Tp, typename... _Tps> void read(_Tp& x, _Tps&... Ar)
{x= 0;char c= getchar();bool flag= 0;while (c < '0' || c > '9')flag|= (c == '-'), c= getchar();while (c >= '0' && c <= '9')x= (x << 3) + (x << 1) + (c ^ 48), c= getchar();if (flag)x= -x;read(Ar...);
}
template <typename T> inline void write(T x)
{if (x < 0) {x= ~(x - 1);putchar('-');}if (x > 9)write(x / 10);putchar(x % 10 + '0');
}
void rd_test()
{#ifdef ONLINE_JUDGE
#elsestartTime= clock();freopen("data.in", "r", stdin);
#endif
}
void Time_test()
{#ifdef ONLINE_JUDGE
#elseendTime= clock();printf("\nRun Time:%lfs\n", (double)(endTime - startTime) / CLOCKS_PER_SEC);
#endif
}
const int maxn= 2e5 + 9;
int dp[maxn][30];
int l[maxn][30];
int vis[20000020];
int a[maxn];
int main()
{//rd_test();int t;read(t);while (t--) {int n, k;read(n, k);for (int i= 1; i <= n; i++) {read(a[i]);int now= a[i];for (int j= 2; j * j <= now; j++) {int cnt= 0;while (now % j == 0) {now/= j;cnt++;}for (int k= 1; k <= cnt; k++)a[i]/= j;if (cnt % 2 == 1)a[i]*= j;}}for (int lim= 0; lim <= k; lim++) {int cnt= 0;for (int i= 1, j= 1; i <= n; i++) {vis[a[i]]++;if (vis[a[i]] >= 2)cnt++;if (cnt > lim) {while (cnt > lim) {if (vis[a[j]] >= 2)cnt--;vis[a[j]]--;j++;}}l[i][lim]= j;}for (int i= 1; i <= n; i++)vis[a[i]]= 0;}for (int i= 0; i <= n; i++)for (int j= 0; j <= k; j++)dp[i][j]= INF_int;dp[0][0]= 0;for (int i= 1; i <= n; i++) {for (int j= 0; j <= k; j++) {for (int x= 0; x <= j; x++) {dp[i][j]= min(dp[i][j], dp[l[i][x] - 1][j - x] + 1);}}}int ans= INF_int;for (int i= 0; i <= k; i++) {ans= min(ans, dp[n][i]);}cout << ans << endl;}return 0;//Time_test();
}

CF1497E2 Square-free division (hard version)相关推荐

  1. CodeForces - 1497E2 Square-free division (hard version)(dp+数论)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的数列,现在最多可以修改 kkk 个数字为任意数值,现在问最少可以将数列划分成多少个连续的数列,使得每一个单独的段中,任意两个数的乘积都不能是完全 ...

  2. CF1497E1 Square-free division (easy version)

    CF1497E1 Square-free division (easy version) 题意: 这是简单版,此题中 k=0 给出一串长为 n 的序列 a1,a2,a3...ana_1,a_2,a_3 ...

  3. E2. Square-free division (hard version) dp + 质因子分解

    传送门 文章目录 题意: 思路: 题意: 给你长度为nnn的数组,让后最多修改其中kkk个数(可以修改为任意数),让后问你分成的最少组是多少.这个组内元素是连续的且不存在任意两个数的积为平方数. 思路 ...

  4. codeforces1497 E. Square-free division(数学+dp)

    开学了,感觉没时间打cf了,上课听不懂,而且一直在忙转班的事情~~ 下周就要回学校了开心 昨天卡C题太久了,一直在想lcm的性质,还好最后回头了,当成构造题做了,瞎搞了搞就出来了,然后看D,由于没有看 ...

  5. Codeforces数学1600day3[数学CodeForces - 1213D2, CodeForces - 1165E 数论,CodeForces - 1165D 因子分解]

    ps:day2太水了不写qwq A - Equalizing by Division (hard version) CodeForces - 1213D2 题目大意:给你n个数和一个k,然后你可以执行 ...

  6. Codeforces Round #661 (Div. 3)题解

    目录 A.Remove Smallest(模拟) B.Gifts Fixing(模拟) C.Boats Competition(暴力枚举) D.Binary String To Subsequence ...

  7. Codeforces Round #708 (Div. 2)

    Codeforces Round #708 (Div. 2) 题号 题目 知识点 A Meximization 思维 B M-arrays 思维 C1 k-LCM (easy version) 构造 ...

  8. Codeforces Round #661 (Div. 3)

    A - Remove Smallest 排个序,如果相邻的数大于一就不满足题意 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) ...

  9. dagger2 注入_如何使用Dagger 2在您的应用程序中实现依赖注入

    dagger2 注入 Kriptofolio应用程序系列-第4部分 (Kriptofolio app series - Part 4) Dependency injection will signif ...

最新文章

  1. 【综述专栏】自动驾驶中可解释AI的综述和未来研究方向
  2. 口碑好的mysql数据监控平台_构建狂拽炫酷屌的 MySQL 监控平台
  3. oracle 数据语句优化,oracle 查询语句优化录
  4. 腾讯邮件服务器发送慢,通过腾讯邮件服务器发送HTML邮件
  5. docker 封装sql_docker封装mysql镜像
  6. HDU1106 排序(解法二)(废除!!!)
  7. json对象与json字符串互转方法
  8. PHP ECSHOP中 诡异的问题:expects parameter 1 to be double
  9. Windows 8 各个版本区别对比
  10. 最新的win10精简版V2004
  11. Win11系统Windows.old怎么删?Windows.old删不了怎么办?
  12. 用python制作贺卡怎么显示人名_制作python程序来处理卡片的麻烦.
  13. pdf文件如何在安卓手机端不用下载在线预览
  14. 如何打造一支优秀的技术团队?
  15. 小日期时间型_利于就业的汽车拆解技术服务师证报名时间、考试流程分几个级别?...
  16. 安装Microsoft-project 2016
  17. python基础 培训班
  18. DOM的readyState属性
  19. element is not attached to the page document报错解决办法
  20. Android 下载文件获取对应链接文件的名称及扩展名

热门文章

  1. 世界上最奇异的10种树,你都见过吗?
  2. 令人难忘的初吻描写......
  3. 想给男友一个惊喜,没想到是这样的结局......
  4. 现在的娃娃有多智能?
  5. 这些高校竟因名字太“坑爹”被误会为三本?盘点九所实力强劲但被名字耽误的大学...
  6. 哪个男孩不想拥有这种牌面?
  7. 每日一笑 | 程序员的日常,这也太真实了......
  8. 交换系统接媒体服务器,基于软交换的媒体服务器的设计与实现
  9. vue 3.0 正式版_Vuejs 3 Release:One Piece. Vuejs 3.0 正式版发布!代号:海贼王
  10. api中文文档 mws_中英文排版规范化 API