首页 > 其他分享 >Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)

Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)

时间:2024-02-09 12:22:24浏览次数:32  
标签:Educational Rated frac int Subarrays long 数组 define 1000

很意思的一道构造题
image

题意:给一个\(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呢?
我们可以找一下规律
image
弄清楚上面的事情,代码就很简单了,我们只需要而分出最后一个满足条件的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,Rated,frac,int,Subarrays,long,数组,define,1000
From: https://www.cnblogs.com/cxy8/p/18012401

相关文章

  • CodeTON Round 7 (Div. 1 + Div. 2, Rated, Prizes!)
    CodeTONRound7(Div.1+Div.2,Rated,Prizes!)比赛链接A.JaggedSwaps思路:考虑到题目要求,给定的排列第一位必须是1才会构造出可行性序列,如果不是就是没有办法Code#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongvoidsolve(){ intn; cin......
  • Codeforces Educational Round
    CodeforcesEducationalRoundEducationalCodeforcesRound160(RatedforDiv.2)(A-D)https://www.cnblogs.com/ComistryMo/articles/17920495.htmlEducationalCodeforcesRound161(RatedforDiv.2)(A-E)https://www.cnblogs.com/ComistryMo/articles/17983580......
  • Educational Codeforces Round 65 (Rated for Div. 2)C. News Distribution(模拟,计算的
    这道题目明显和出现4次的数和出现2次的数的个数有关系,只需要在每次更新之后维护这两个信息即可,我们在算出现2次的数的个数时其实会把出现4次的数的个数会把出现2次的数的个数+2,在判断时需要考虑这一点。也就是\(cnt2>=4\&\&cnt4>=1\)时才有解#include<bits/stdc++.h>#definer......
  • Educational Codeforces Round 159 (Rated for Div
    EducationalCodeforcesRound159(RatedforDiv.2)ABinaryImbalance题目大意给定一个长度为n的一个01字符串,我们执行以下操作:当s[i]!=s[i+1]在中间插入0问:是否可以实现0的个数大于1的个数解题思路由题意可以明显看出只要有0就可以实现。下面简单分析下:0的个数大......
  • Educational Codeforces Round 160 (Rated for Div
    ARatingIncreas题目大意给定一个数字,让我们拆分成两个数,这两个数满足以下条件:a<b.两个数没有前缀0.问:输出满足条件的数a,b.解题思路直接暴力循环这个数的位数次,若满足a<b,再判断两个数的位数和是否与拆分前相同.代码#include<bits/stdc++.h>#defin......
  • Educational Codeforces Round 161 (Rated for Div
    ATrickyTemplate题目描述给一个数字n和三个长度为n的字符串a,b,c。找一个模板使得字符串a,b匹配,而c不匹配,是否存在这样一个模板.匹配的定义是:当模板字母为小写时,两个字符串字符相同,为大写时,两个字符不同,这样的两个字符串则匹配解题思路我们可以直接得出当a字符串......
  • (区间覆盖问题)P5019 [NOIP2018 提高组] 铺设道路和Educational Codeforces Round 158 (
    区间覆盖问题这里EducationalCodeforcesRound158(RatedforDiv.2)b题和[NOIP2018提高组]铺设道路两道典型题目,本质是相同的。这里由于题目多次出现,特此记录。解题思路:首先我们得对区间做划分,那么划分思路可以是从小到大也可以是从大到小的异常点来做划分(我这是由大到......
  • Educational Codeforces Round 161 (Rated for Div. 2)
    基本情况A犯病卡半小时。主要就是太着急,题目没有彻底分析清楚就开始想一些错误做法。C最优想法出来的慢。E比较好想。C.ClosestCitiesProblem-C-Codeforces就,显然是能走最近城市就走,不行就不走。一开始弄了一个自作聪明的预处理,但实际上每次查询还是\(\operatorn......
  • Educational Codeforces Round 161 (Rated for Div. 2)
    A.TrickyTemplate思维有点难转过来,而且当时在C也能匹配c这卡了很久#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn; cin>>n; stringa,b,c; cin>>a>>b>>c; intcnt=0; intf=0; for(inti=0;i<n;i++){ if(a[i]!=c[i]&&a......
  • Educational Codeforces Round 161 (Rated for Div. 2)
    题目链接:EducationalCodeforcesRound161(RatedforDiv.2) PS:A开的很快,B读个假题意,C又想歪了,导致E没时间写,最后十分钟开E思路对了但是没时间了,赛后很快过了。。。A.TrickyTemplate题意:定义模板串t与字符串s:1:如果模板串的某一项为小写字母,那么模板串与字符串的该......