尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

codeforces 1504 div3

codeforces 1504 div3
📅 发布时间:2026/6/19 18:55:45
codeforces 1504 div3

codeforces 1054 div3

D

就是枚举最后答案的所有可能就好了,aba,bab ...

赛时没想到怎么算花费,结果在这题上码死了,

这种花费真心不擅长算,只知道批处理,子数组思维,没有动态的思路,这个就很动态

但是我就是不会算

赛时想的是前一半是 正 + 负, 后一半是负 + 正,找位置二分求和当前下标,然后根据上面划分计算两边花费,就是前缀和的问题,从中间位置开始

然后就si了,

int work(char ch){vector<int> pos;For(i,1,n) if(s[i] == ch) pos.pb(i);m = pos.size();if(m <= 1) return 0;vector<int> pre(m+1),newpos(m+1); // pos[k] ~ i + k - 1For(i,1,m) pre[i] = pre[i-1] + pos[i-1];For(i,1,m) newpos[i] = pos[i-1] - i;int res = LLONG_MAX;For(i,1,n-m+1){k = upper_bound(newpos.begin()+1,newpos.end(),i-1) - newpos.begin() - 1;int cost = 1ll*k*i + 1ll*(k-1)*k/2 - pre[k] + pre[m] - pre[k] - 1ll*(m-k)*(i-1) - (1ll*m*(m+1)/2 - 1ll*(k+1)*k/2);res = min(cost,res);}return res;
}void Solve(){cin >> n >> s, s = " " + s;int ans = min({work('a'), work('b')});cout << ans << '\n';
}

以下是 xll 的计算花费的方式,%%%

同样是枚举所有数组,但是先移到最左边作为base花费,然后从最左边一个个移动到最右边计算花费

int work(char ch){int tot = 0, res = 1e18;vector<int> pos;For(i,1,n) if(s[i] == ch) {pos.pb(i);tot += i - pos.size(); // 移到最左边花费 // cerr << i << ' ' << pos.size() << '\n';}res = min(res,tot);m = pos.size();for(int i=m;i>=1;--i){ // 每次移动一个到达最右边tot += n - m + i-pos[i-1] - (pos[i-1] - i);res = min(res, tot);}return res;
}void Solve(){cin >> n >> s, s = " " + s;// cout << work('a') << '\n';cout << min(work('a'), work('b')) << '\n';
}

E

经典恰好容斥计数吧,滑窗统计子数组符合条件的数量,然后就没有然后了

长度在区间 [l,r] 内恰好存在 k 种数字的区间个数

f(x,k) 长度至多为 x 的,至多 k 种类数 的区间个数

ans = f(r,k) - f(r,k-1) - (f(l-1,k) - f(l-1,k-1))

限制长度的滑窗子数组计数,用左端点收区间,然后计算所有有效右端点的贡献就是了

void Solve(){cin >> n >> k >> l >> r;vector<int> num(n+1);For(i,1,n) cin >> num[i];auto f = [&](int Len,int k)->int{map<int,int> cnt;int l = 1, kind = 0, res = 0;For(r,1,n){if(++cnt[num[r]] == 1) ++kind;while(kind > k ) {if(--cnt[num[l++]] == 0) --kind;}int minL = max(l, r - Len + 1);if (minL <= r) res += (r - minL + 1);}return res;};cout << f(r,k) - f(r,k-1) - (f(l-1,k) - f(l-1,k-1)) << '\n';
}

F

防到了 fjust 老学长AK的题,我能做出来吗

显然二分,但是怎么 check,无了

xll %%%

二分休息次数,每次休息就从1开始走一段,产生连续花费,尽可能走更多的连续段,

中间分开休息 Mid 次,与最开始一共休息 Mid 次没有区别,

最后只要查看血量是否能撑住这些段活下去就行了

由于段长和段的数量都知道了,且尽量让每一段更长,所以计算方式就很清晰了

先平分所有段,然后剩下的就分配到平均段长 +1,产生对应花费就行了

void Solve(){cin >> m >> n; // m 点生命值,到达 n 点if(m==1) return cout << n*2 << '\n', void();--m;auto check = [&](int mid) -> bool{int t = n/(mid+1);x = n % (mid+1), y = mid + 1 - x;ll tot = (t+1)*(t+2)/2*x + t*(t+1)/2 * y;return tot <= m + mid;};int l = 0, r = n,mid, ans;while(l <= r){mid = (r+l) >> 1;if(check(mid)) r = mid - 1, ans = mid;else l = mid+1;}cout << l + n << '\n'; // 基础走 n 步,再最少休息 l 步
}

相关新闻

  • 2 day - when
  • Chormium 密码管理器表单结构体说明(基于Chromium138)
  • 深入解析:KRaft 运维从静态到动态 Controller

最新新闻

  • 模糊照片怎么修复?推荐 6 个实测好用的清晰化工具 - 软件工具教程方法
  • 终极指南:如何无损解密QQ音乐加密音频的完整技术方案
  • 枚举与模式匹配:Python 3.10+新特性
  • 2026AI修图天花板!ImageGood文字指令一键出大片,电商自媒体全能神器 - GrowthUME
  • 图神经网络与大语言模型融合的挑战与解决方案
  • 多功能复杂腕表变现,天津专业回收店分类精准估价 - 讯息早知道

日新闻

  • 信任的进化:技术实现详解——如何用JavaScript构建博弈论模拟器
  • Terrakube自定义工作流:如何集成OPA、Infracost等工具扩展IaC能力
  • grunt-concurrent快速入门:5分钟学会并行运行Grunt任务

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号