CF1497E2 Square-free division (hard version)

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]][jx]+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();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/315967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Cake] 2. dotnet 全局工具 cake

在上篇博客[Cake] 1. CI中的Cake中介绍了如何在CI中利用Cake来保持与CI/CD环境的解耦。当时dotnet 2.1还未正式发布&#xff0c;dotnet 还没有工具的支持&#xff0c;使得安装cake非常麻烦。不过随着 dotnet tool 的加入&#xff0c;这一问题得到了很好的解决。目前安装cake&am…

CF1497C k-LCM

CF1497C1 k-LCM (easy version) CF1497C2 k-LCM (hard version) 题意&#xff1a; 给定一个整数 n&#xff0c;请找到 k 个和为 n 的正整数a1,a2,....,aka_1,a_2,....,a_ka1​,a2​,....,ak​&#xff0c;使得lcma1,a2,....,ak<n2lcm{a_1,a_2,....,a_k}<\frac{n}{2}lcm…

官博翻译 | .NET Core 即 .NET 的未来

点击上方蓝字关注“汪宇杰博客”文 / Scott Hunter译 / 汪宇杰我们在2014年11月推出了.NET Core 1.0。.NET Core 的目标是借鉴我们过去12年构建、发布和服务.NET Framework的经验去构建更好的产品。这些改进如&#xff1a;并行安装&#xff08;您可以安装新版本&#xff0c;而…

CF1497D Genius

CF1497D Genius 题意&#xff1a; n个问题从i到n编号&#xff0c;第i个问题给出的ci2i,tagi,sic_i2^i,tag_i,s_ici​2i,tagi​,si​ 解决问题i后解决问题j条件是&#xff1a;IQ<|ci−cjc_i-c_jci​−cj​|,同时获得|si−sjs_i-s_jsi​−sj​|分 问题解决得次数和顺序不受限…

微软发布ML.NET 1.0,可一键添加机器学习模型

今天&#xff0c;我们很高兴宣布发布 ML.NET 1.0。ML.NET 是一个免费的、跨平台的开源机器学习框架&#xff0c;旨在将机器学习&#xff08;ML&#xff09;的强大功能引入.NET 应用程序。ML.NET GitHub&#xff1a;https://github.com/dotnet/machinelearning入门 http://dot.…

Codeforces Round #703 (Div. 2)

Codeforces Round #703 (Div. 2) 题号题目知识点AShifting Stacks思维BEastern Exhibition思维C1Guessing the Greatest (easy version)二分C2Guessing the Greatest (hard version)二分DMax Median思维二分EPaired PaymentFPairs of Paths

目前下载VS2017你可能会遇到这个坑

可能现在大伙都已经开始使用VS2019进行开发了。VS2019的下载使用也都很简单。由于工作需要&#xff0c;今天要在笔记本上安装VS2017,结果发现&#xff0c;VS2017的下载变得不是那么容易了&#xff0c;官方的下载方式也隐藏的很深&#xff0c;来来回回折腾了好一会才下载下来&am…

CF1486D Max Median

CF1486D Max Median 题意&#xff1a; 给定一个长度为 n 的序列 a&#xff0c;求所有长度 ≥k 的连续子序列中&#xff0c;中位数的最大值。定义中位数是一个长度为 x 的序列升序排序后的第 ⌊x12⌋\left\lfloor\frac{x1}{2}\right\rfloor⌊2x1​⌋位的值。 题解&#xff1a…

代码整洁之道(Clean Code)- 读书笔记

Sorry, 许久未更新文章了&#xff0c;主要因为刚刚换了一家新公司&#xff0c;忙于组建团队&#xff08;建设、招聘、流程、框架等&#xff09;与熟悉公司业务&#xff0c;还有领导给的其他工作等等&#xff0c;实在是没有时间更新了。最近在和团队分享Bob大叔的《Clean Code》…

cf1499D. The Number of Pairs

cf1499D. The Number of Pairs 题意&#xff1a; 有t组询问&#xff0c;每组询问给定三个整数c&#xff0c;d&#xff0c;x 问有多少对(a,b)使得c∗lcm(a,b)−d∗gcd(a,b)xc*lcm(a,b)-d*gcd(a,b)xc∗lcm(a,b)−d∗gcd(a,b)x 1<t<1e4,1<c,d,x<1e71<t<1e4,1&…

微软Build 2019大会.NET课程视频汇总

点击上方蓝字关注“汪宇杰博客”5月6日至8日&#xff0c;微软在西雅图召开了Build 2019开发者大会。我们关注的.NET领域也迎来了许多激动人心的改进。本文汇总了Build 2019大会上关于.NET的已经公开的视频&#xff0c;欢迎大家观看学习&#xff01;// 注意&#xff1a;以下视频…

Educational Codeforces Round 106 (Rated for Div. 2)

Educational Codeforces Round 106 (Rated for Div. 2) 题号题目知识点ADomino on WindowsillBBinary RemovalsCBinary Removals贪心DThe Number of Pairs推导EChaotic MergeFDiameter CutsGGraph Coloring

黑科技抢先尝 | Windows全新终端初体验(附代码Build全过程)

微软在几天前的build大会上展示了Windows Terminal的威力&#xff0c;由于官宣要在6月中旬才上Microsoft store&#xff0c;还有一个多月要等呢。好在代码已公布在 github, 于是决定自己 build 后体验一番。遇到不少坑&#xff0c;大概整理一下流程&#xff0c;分享给大家。如果…

二项式反演(非详细)

引入 二项式反演又名广义容斥定理 二项式反演可以表示成&#xff1a; f[n]∑i0n(−1)iCnigi⟺gn∑i0n(−1)iCnif[i]f[n]\sum_{i0}^n(-1)^iC_{n}^{i}g_{i}⟺g_{n}\sum_{i0}^{n}(-1)^iC_{n}^{i}f[i]f[n]∑i0n​(−1)iCni​gi​⟺gn​∑i0n​(−1)iCni​f[i] 常用表达为&#xff…

aelf帮助C#工程师10分钟零门槛搭建DAPP私有链开发环境

aelf是一个可扩展的去中心化云计算区块链平台&#xff0c;支持高性能合约并行执行、原生多链数据交互、存储使用高性能分布式数据库。aelf整个系统可以在windows、osx及linux运行&#xff0c;团队在osx环境下开发&#xff0c;基于.net core DAPP开发1.安装.net core及protobufh…

不容易系列之一

不容易系列之一 题意&#xff1a; n个数&#xff0c;求n个人错排(全部错误)的方案数 题解&#xff1a; 这题地推可以求&#xff0c;咱们这里用二项式反演来做 设f(i)为恰好有i个人错排f(i)为恰好有i个人错排f(i)为恰好有i个人错排&#xff0c;g(i)为最多i个人错排g(i)为最多…

Build 2019 上微软的开源动作有点不一样

微软今年举办的 Build 开发者大会可谓是抢足风头&#xff0c;大会第一天就放了不少大招&#xff1a;宣布新的命令行终端 Windows Terminal、Windows 10 的 Linux 子系统 WSL 2 将运行真正的 Linux 内核、跳过 .NET 4 宣布 .NET 5 的计划、宣布 Web 版本的 VS Code (Visual Stud…

P1437 [HNOI2004]敲砖块

P1437 [HNOI2004]敲砖块 题意&#xff1a; 在一个凹槽中放置了 n 层砖块、最上面的一层有 n 块砖&#xff0c;从上到下每层依次减少一块砖。每块砖都有一个分值&#xff0c;敲掉这块砖就能得到相应的分值&#xff0c;如下图所示&#xff1a; 14 15 4 3 2333 33 76 22 …

在kubernetes 集群内访问k8s API服务

所有的 kubernetes 集群中账户分为两类&#xff0c;Kubernetes 管理的 serviceaccount(服务账户) 和 useraccount&#xff08;用户账户&#xff09;。基于角色的访问控制&#xff08;“RBAC”&#xff09;使用“rbac.authorization.k8s.io”API 组来实现授权控制&#xff0c;允…

C. 奇奇怪怪的魔法阵(未搞懂)

C. 奇奇怪怪的魔法阵 题意&#xff1a; n个点m条边&#xff0c;定义集合S为独立集&#xff0c;当且仅当任意x,y∈S&#xff0c;x与y之间没有边。空集也是独立集 现在对于每一个点的集合T&#xff0c;有多少子集为独立集 设N0,1,…,n-1,AT∑S⊂T[S是独立集]A_{T}\sum_{S⊂T}[S…