很意思的一道构造题

题意:给一个\(n、k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)* n/2\),每个数的范围为\([-1000,1000]\)

这种构造题可以考虑就是前一段可以一直用一样的、最小的。

我们观察可以发现\(k+k-(n+1)* n/2= (n+1)* n/2\)

也就是所有子数组的个数,换句话说子数组不能有0。

这样我们很容易考虑用很小的一个负数和一个很小的正数去构造

这里我用的是\(1\)和\(-1000\)

我们先考考虑一下前一段是p个1,后面全是-1000的情况这样我们得到的正数组有\(\frac{(p+1) * p}{2}个\)

当\(k=\frac{(p+1) * p}{2}\)时,自然皆大欢喜

当\(k>=\frac{(p+1) * p}{2}\)时,我们考虑一下剩下的\(k-\frac{(p+1) * p}{2}\)该如何臭凑出来,能增加p吗?,当p+1,我们会增加p+1个正数组,这是不行的,我们考虑的p的最大满足\(k>=\frac{(p+1) * p}{2}\)的p,也就是说缺少的正数组个数是在\([1,p]\)

我们可以选择前面p个1中的一个将其变为1000,\(p+1\)处的-1000遍为500,这样我们就可以添加\([1,p]\)个正数组,哪个位置的1变为1000呢?

我们可以找一下规律



弄清楚上面的事情,代码就很简单了,我们只需要而分出最后一个满足条件的p然后按照上面的构造方法放数即可

#include <bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define pll pair<long long, long long>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back using namespace std; const int N=5e3+10,mod=100003,inf=(1ull<<63)-1;
int n,m,k;
int vis[N],d[N];
int a[1010],b[1010]; void solve()
{
cin>>n>>k;
int l=0,r=n;
while(l<r){
int mid=(l+r+1)>>1;
if(mid*(mid+1)/2<=k) l=mid;
else r=mid-1;
}
if(l*(l+1)/2==k){
rep(i,1,l) cout<<1<<' ';
rep(i,l+1,n){
if(i==l+1) cout<<-500<<' ';
else cout<<-1000<<' ';
}
cout<<endl;
}else{
int d=k-(l*(l+1))/2;
rep(i,1,l){
if(i==d) cout<<1000<<' ';
else cout<<1<<' ';
}
rep(i,l+1,n){
if(i==l+1) cout<<-500<<' ';
else cout<<-1000<<' ';
}
cout<<endl;
}
} signed main(){
ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
// freopen("1.in", "r", stdin);
int _;
cin>>_;
while(_--)
solve();
return 0;
}

Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)的更多相关文章

  1. Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)

    #include<bits/stdc++.h>using namespace std;const long long mod=998244353;long long f[200007][2 ...

  2. Educational Codeforces Round 95 (Rated for Div. 2) B. Negative Prefixes (贪心,构造)

    题意:给你一串长度为\(n\)的序列,有的位置被锁上了,你可以对没锁的位置上的元素任意排序,使得最后一个\(\le0\)的前缀和的位置最小,求重新排序后的序列. 题解:贪心,将所有能动的位置从大到小排 ...

  3. Educational Codeforces Round 94 (Rated for Div. 2) C. Binary String Reconstruction (构造)

    题意:给你一个字符串\(s\),原字符串为\(w\),如果\(i>x\)且\(w_{i-x}=1\),那么\(s_{i}=1\),如果\(i+x\le n\)且\(w_{i+x}=1\),那么\ ...

  4. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  5. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

  6. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  7. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  8. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...

  9. Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes

    Codeforces Educational Codeforces Round 44 (Rated for Div. 2) E. Pencils and Boxes 题目连接: http://code ...

  10. Educational Codeforces Round 63 (Rated for Div. 2) 题解

    Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...

随机推荐

  1. TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用

    TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术.提供便捷快速的知识蒸馏框架.提升模型的推理速度,减少内存占用 TextBrewer是一个基于PyTorch的.为实现NLP中的知识蒸 ...

  2. 【四】AI Studio 项目详解【VisualDL工具、环境使用说明、脚本任务、(四)图形化任务、在线部署及预测】PARL

    相关文章 [一]-环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简介 [五]-Sarsa&Qlear ...

  3. 6.7 Windows驱动开发:内核枚举LoadImage映像回调

    在笔者之前的文章<内核特征码搜索函数封装>中我们封装实现了特征码定位功能,本章将继续使用该功能,本次我们需要枚举内核LoadImage映像回调,在Win64环境下我们可以设置一个LoadI ...

  4. C/C++ 反汇编:多维数组与指针

    反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高级语言代码都有相当大的帮助, ...

  5. 在Golang中实现多态

    目录 1.说明 2.多态 3.代码示例 4.总结 1.说明 和流行的面向对象语言不同,go 中没有面向对象的说法,也没有对应的封装.继承和多态,也许 go 的设计就不是和OOP对齐,想使用OOP,那就 ...

  6. 路由react-router-dom的使用

    react-router-dom路由简介 现代的前端页面大多是SPA(单页面应用程序), 也就是只有一个HTML页面的程序,这样用户体验好,服务器压力小,所以更受欢迎.路由是使用单页面来管理原来多页面 ...

  7. 程序员必备技能:一键创建windows 服务

    使用windows开发或者使用windows服务器的朋,应该经常会遇到有些程序要开机启动,或者有些服务要持续执行. 这样最稳定可靠的,就是把程序创建为windows服务. 以下bat脚本,仅供参考. ...

  8. .NET Core开发实战(第1课:课程介绍)--学习笔记

    01 | 课程介绍 讲师介绍 肖伟宇,校宝在线架构师.SkyWalking .NET探针贡献者.NetCorePal组件库创建者 为什么要学习 .NET Core 微软大力支持推动 .Net 技术生态 ...

  9. CF510D Fox And Jumping

    题目链接 题目 见链接. 题解 方法一 知识点:背包dp,STL. 题目意思是让我们判断能否从这些数中选出一些数使得选的数公共gcd为 \(1\),如果可以输出最小花费. 一眼背包dp,但要map超大 ...

  10. Ubuntu下使用PlatformIO开发STC89/STC12/Arduino

    安装VSCode 从 https://code.visualstudio.com/Download 下载最新的 deb 版, 通过命令行安装 sudo apt install ./code_1.59. ...