二分+前缀和优化累加

news/2025/3/19 19:49:45/文章来源:https://www.cnblogs.com/letscode/p/18781653

目录
  • 题意
  • 分析
  • ac代码

题意

有 n 块木板排成一排的围栏。

莫诺卡普决定按照以下规则粉刷围栏:

  • 栅栏的每块木板都要涂上一种颜色;
  • 栅栏上的每块木板都要涂上恰好一种颜色;在m种颜色中只能选两种颜色
  • 涂上相同颜色的栅栏木板必须形成一个连续的序列,也就是说,所有涂上相同颜色的木板对之间都没有涂上不同颜色的木板。

Monocarp 公司有 m 种不同的油漆,其中 i 种颜色的油漆足以涂刷不超过 ai 块木板。Monocarp 不会再购买其他油漆。

你的任务是确定满足 Monocarp 所描述的所有愿望的不同栅油漆方法的数量。如果有一块木板在这两种涂漆方式下被涂上了不同的颜色,那么这两种涂漆方式就被认为是不同的。

输入

第一行包含一个整数 t( 1≤t≤1e4 ) - 测试用例数。

每个测试用例的第一行包含两个整数 n 和 m ( 2≤n,m≤2⋅105) --栅栏中木板的数量和 Monocarp 拥有的不同颜色油漆的数量。

第二行包含 m 个整数 a1,a2,…,am ( 1≤ai≤n ),其中 ai 是可以涂上颜色为 i 的油漆的最大木板数。

所有测试用例的 n之和不超过 2⋅1e5。所有测试用例中 m 的总和不超过 2⋅1e5 。

输出

对于每个测试用例,输出满足 Monocarp 所描述的所有愿望的不同栅栏喷漆方法的数量。

Example

Input

Copy

3
5 2
2 4
5 2
3 4
12 3
5 9 8

Output

Copy

4
6
22

在第一个测试案例中,栅栏有 44 种不同的涂色方法(下面列出了从左到右可涂色木板的色号序列):

  1. [1,2,2,2,2]
  2. [1,1,2,2,2]
  3. [2,2,2,1,1]
  4. [2,2,2,2,1]

在第二个测试案例中,有 66 种不同的方法来粉刷栅栏(下面列出了从左到右粉刷木板的色号序列):

  1. [1,2,2,2,2]
  2. [1,1,2,2,2]
  3. [1,1,1,2,2]
  4. [2,2,1,1,1]
  5. [2,2,2,1,1]
  6. [2,2,2,2,1]

分析

涂满长度为n的围栏, 只能用两种颜色

注意到题目要求必须使用到两种颜色, 所以对于a[i]==n, 必须先 -1 . (假如这颜色能涂n个木板, 实际最多也只能涂n-1个)

首先可以先对每种颜色可以涂的围栏数量,也就是a[]数组进行排序

从小到大遍历a数组, 对于每个a[i], 寻找能配对的颜色

什么才能配对呢?

当然是 选涂的木板的数量+a[i]>=n 的才可以

对每个符合的配对颜色 答案ans可以加上 ( a[i] - ( n - a[j] ) + 1 ) * 2

(如果不明白这步可以随便选一个长度n,和一对符合的颜色对来试着计算一下发现规律)

现在就可以很朴素地用双指针解决问题......了吗?

 rep(i,1,m-1){for(int j=m;j>i;j--){if(a[i]+a[j]<n)break;ans+=(a[i]+a[j]-n+1)*2;}}

这会导致超时

注意到那么对里面那层循环分析, 假设循环了k次, 那么ans就加上了k个a[i] , a[m-k+1] 到 a[m] 的和, k个n, k个1, 这些的和乘2

那么就可以考虑用二分找到k, 再用前缀和O(1) 地计算a[m-k+1] 到 a[m] 的和了

前缀和可以优化循环的公式累加, 这或许是个常用的技巧

ac代码

#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define all(x) (x).begin(),(x).end()
#define endl '\n'
#define int long longconst int N=2e5+5;int a[N];
int pre[N];
int n,m;void solve(){int n,m;cin>>n>>m;rep(i,1,m){cin>>a[i];if(a[i]==n)a[i]-=1;// 处理a[i]==n}sort(a+1,a+1+m);rep(i,1,m)pre[i]=pre[i-1]+a[i];int ans=0;rep(i,1,m-1){// for(int j=m;j>i;j--){ //朴素的双指针解法: 超时//     if(a[i]+a[j]<n)break;//     ans+=(a[i]+a[j]-n+1)*2;// }// 二分查找从左往右第一个符合与a[i] 能配对的颜色,后面当然都可以配对啦int l=i,r=m+1;while(l+1!=r){int mid=l+r>>1;if(a[mid]+a[i]<n)l=mid;else r=mid;}// rif(r==m+1)continue;// 说明对于当前a[i],即使找能涂最多的木板的颜色也不能涂完所有的木板int cnt=m-r+1;ans+= (a[i]*cnt+pre[m]-pre[r-1]-n*cnt+cnt)*2; }cout<<ans<<endl;
}signed main(){ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);int _;cin>>_;while(_--)solve();return 0;
}

题目来自 Educational Codeforces Round 176 (Rated for Div. 2) C. Two Colors

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

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

相关文章

Amphion 推出合成音频鉴别系统 Auditi;Gemini 引入 NotebookLM 功能,生成文档、网页音频摘要丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观点 」、「有看点的 活动 」,但内容仅代表编辑…

洛谷题单指南-图论之树-P3398 仓鼠找 sugar

原题链接:https://www.luogu.com.cn/problem/P3398 题意解读:一颗n个节点的树,m个判断,判断树上两条路径是否相交,相交输出Y,否则输出N 解题思路:此题需要画一棵多叉树来辅助判断多次观察相交的路径,可以得出一个关键性质: 两条路径相交,必然有一条路径的LCA在另一条…

lg 主页

\(\Large\text{My Blog}\)中学:济南天山高级实验中学 关于我的学校究极久远预告:寒假游记滚滚长江东逝水,浪花淘尽英雄 是非成败转头空 青山依旧在,几度夕阳红 白发渔樵江渚上,观看秋月春风 一壶浊酒喜相逢 古今多少事,都付笑谈中街喧闹,人过往 且记曾相识,莫为少年留 …

day:25 selenium之介绍和环境配置

一、selenium介绍 selenium是一个第三方库,python有很多库; 1、什么是ui自动化? 通过模拟手工操作用户ui页面的方式,用代码去实现自动化操作和验证的行为。 2、ui自动化的优点? (1)解决重复性的功能测试和验证 (2)减少测试人员在回归测试时用例漏测和验证点的漏测 (3…

[算法学习记录] [更新中]最短路

顾名思义,最短路算法,就是求一个图中所有的点距某一个点的最短距离,常见的有Dijkstra算法、Bellman-Ford算法、Johnson算法与Floyd算法。 Dijkstra Dijistra算法实际上是一种由贪心与动态规划结合的算法,我们每次都贪心地选择到某个点的最近距离,又动态地更新着距离数组d的…

day6-static静态变量

静态变量/静态方法 被static修饰 工具类静态方法不能调用非静态。 非静态可以访问所有。 继承一个子类只能继承一个父类,可以多层继承,最大的父类为Objectcoding 练习:更好的方法:双指针不浪费空间

SpringBoot引入JWT实现用户校验

一JWT JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这些信息以JSON对象的形式存储在令牌中,并且可以被签名和加密。JWT通常用于身份验证和信息交换主要用途 身份验证:当用户登录成功后,服务器会生成一个JWT并返回给客户端。之后…

mcp-playwright测评

mcp-playwright介绍 mcp-playwright是一个使用 Playwright 提供浏览器自动化能力的模型上下文协议服务器。该服务器使 LLMs 能够与网页交互、截屏,并在真实的浏览器环境中执行 JavaScript。 GitHub地址:https://github.com/executeautomation/mcp-playwright。安装 npm insta…

传媒行业项目管理全解析:日事清在流程、文件、数据与风控中的一体化应用

一、关于森可文化 森可文化传媒有限公司(Senke Vision)占据了超过2800平方米的宽敞办公及拍摄场地,与众多内衣及服饰行业的上市巨头建立了不可动摇的深度合作关系。 Senke Vision汇聚了国内外顶尖的策划、设计、摄影摄像、服装搭配、化妆及品牌视觉顾问,形成了一支独一无二…

在 .NET 项目中使用 husky 完成 pre-commit 操作

将 husky 引入 .NET 项目Husky 是一个用于 Git 仓库的工具,主要用于管理 Git 钩子(hooks)。它可以帮助开发者在特定的 Git 操作(如提交、推送等)之前或之后执行自定义的脚本或命令,从而提高代码质量和团队协作效率。 主要用在前端项目中,可以通过 Husky.Net,将 Husky 的…

贸易企业数字化转型案例:基于日事清的目标管理、任务协作与流程可视化绩效优化实践

这家贸易公司如何提升内部协同效率?一、基本情况 所属行业:传统贸易行业 业务类型:国内贸易、货物及技术进出口 行业地位:拥有自己的研发人员,具备一站式解决方案能力。 合作概要:为解决组织提效,目标体系、协同体系、绩效体系的管理问题,客户与日事清达成合作,并将日…

使用nvm管理node.js版本

1.情景展示如上图所示,项目某个模块支持的node.js最高版本是17,我用的是20,所以只能降级。 2.具体分析 我现在把node.js降到16,那后续如果再需要20呢?能不能实现版本的随时切换? 3.安装nvm 我们可以使用nvm来管理node.js的版本。 下载nvm windows下载地址:https://githu…