CF1809C Sum on Subarrays 题解
一道黄题做了一上午我可以退役了。
构造题。由于直接构造并不是那么容易,所以考虑在一个初始元素全为 的序列上构造。
考虑将一个负数改为正数 对答案造成的贡献(因为取 计算比较方便)。设在放置这个正元素之前已经放置了 个正元素,则这个正元素会造成 的贡献,也就是会创造 个新的正区间。
原因显然,由于负数均为 , 又小于等于 , 相当于正无穷,所以从这个元素到序列中的任何一个位置都是正区间。如果某一个位置已经是 了,那么在插入之前的这个 时已经计算了这一段区间,需要减去不计算,所以贡献为 。
由于位置无关,我们尽量把 往后放,如果再放一个 就超过了正区间的数量,我们考虑在前面创造一些单独的正区间。设剩下的数为 ,则我们将第一个数改为 ,很明显,这也相当于一个正无穷。然后,我们要把第 个位置的数改为 ,消除 对后面的数的影响。由于之前放的数是 ,所以 并不会影响其正无穷性质。
第一个数 可以把从第一个数开始到 以前的区间变成正区间,刚好是 个正区间,刚好符合要求。
#include <bits/stdc++.h>
using namespace std;
long long t,n,k,a[40];
int main()
{
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&n,&k);
long long now=n;
for(int i=1;i<=n;i++)a[i]=-1;
for(int i=n;i>=1;i--)
if(k>=now)a[i]=1000,k-=now,now--;
else break;
if(k!=0)a[1]=200,a[k+1]=-400;
for(int i=1;i<=n;i++)printf("%lld ",a[i]);
printf("\n");
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探