首页 > 其他分享 >Educational CF Round 171

Educational CF Round 171

时间:2024-11-02 17:08:41浏览次数:1  
标签:Educational limits int sum 元素 CF ans 配对 171

游记

理所当然VP
秒速过A,打B犯了一天的傻逼看错条件
理所当然的只过了一道愉快开启改题生活
当然改题也挺那啥的

题解

A

挺简单的
找\(X,Y\)的最小值,即找到长方形可框住的最大的正方形
直接输出此正方形的顶点坐标即可
证明考虑超出此正方形的点在旋转平移以后都会超出长方形范围

B

如果是只能白点染成黑点,
那其实只能是\(A\)中元素两两一组且不重复出现
那其实要求的就是所有配对元素两两之间间隔最大值
考虑到如果出现不相邻的元素配对一定可以通过换成相邻元素配对来减小最大间隔
所以肯定是相邻配对
偶数的话就是\((2k-1,2k)\)这样,
否则会出现两个元素不满足最优决策落单,就会涂两个\(A\)以外的格子
奇数的话就是随便删一个元素,看看剩下\(n-1\)个元素两两配对最大值
枚举每一个删掉的元素,再按照偶数情况解决,时间复杂度\(O(n^2)\)
其实删一个元素,只有\((i-1,i+1)\)动了,其余的不动
可以直接维护前后缀,看看会发生什么变化
如果删一个奇数,配对情况还是前后缀和维护范围以内
如果删偶数,就需要用上下一个偶数的信息加上中间缝隙维护

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int o=222222;
int t,n,k,ans,a[o],f[o],s[o];
void in(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
}
void work(){
	if(n==1){
		ans=1;
		return;
	}
	if(n%2){
		ans=1e18;
		for(int i=2;i<=n;i+=2)
			f[i]=max(f[i-2],a[i]-a[i-1]);//前缀,偶数
		for(int i=n-1;i>=1;i-=2)
			s[i]=max(s[i+2],a[i+1]-a[i]);//后缀,偶数头上
		for(int i=1,now=0;i<=n;i++){
			now=0;
			if(i%2)now=max(f[i-1],s[i+1]);
			else{
			//	printf("i=%d,%d %d %d",i,a[i+1]-a[i-1],f[i-2],s[i+2]);
				now=max(now,a[i+1]-a[i-1]);
				now=max(now,f[i-2]);
				now=max(now,s[i+2]);
			}
			//printf("now=%d i=%d\n",now,i);
			ans=min(ans,now);
		}
	}
	else{
		for(int i=1;i<=n/2;i++)ans=max(a[2*i]-a[2*i-1],ans);
	}
}
void out(){
	cout<<ans<<endl;
}
void clear(){
	for(int i=1;i<=n;i++){
		f[i]=0,s[i]=0,a[i]=0;
	}
	n=ans=0;
}
#undef int 
int main(){
	cin>>t;
	while(t--){
		in();
		work();
		out();
		clear();
	}
	return 0;
}

提交记录

C

如果可以的话,能分开多买几次就不要集中买
否则可能会亏一次免费名额
其次,如果可以的话,用尽可能便宜的东西和贵的东西组一队拿下
倒序扫整个串,这样比较简单,出去肯定回不来了
对于\(s_i=0\)的情况,因为能多买就多买,买的那天的货物才会优惠,
所以\(i\)不可能会沾到优惠,直接加到答案里就行
否则,\(s_i=1\)的情况,既可能是直接免费拿下,也还可能是单着不急着配对
维护一个deque,把\(i\)扔到队头
如果碰上一个\(s_j=0\)把队尾最大的那个\(i\)出去买下
(队列空那就是没办法了)
如果最后剩下,那就是队头配队尾

点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int o=222222*2;
int T,n,ans,f[o];
char s[o];
deque<int>c;
int sum(int l,int r){
	return (l+r)*(r-l+1)/2;
}
void in(){
	cin>>n;
	scanf("%s",s+1);
}
void work(){
	for(int i=n;i>=1;i--){
		if(s[i]=='1')c.push_front(i);
		else{
			if(!c.empty())c.pop_back();
			ans+=i;
		}
	}
	while(!c.empty()){
		if(c.size()==1){
			ans+=c.front();
			break;
		}
		ans+=c.front();
		c.pop_front();
		c.pop_back();
	}
	
}
void out(){
	cout<<ans<<'\n';
}
void clear(){
	for(int i=1;i<=n;i++)s[i]=0;
	n=0,ans=0;
	c.clear();
}
#undef int 
int main(){
	cin>>T;
	while(T--){
		in();
		work();
		out();
		clear();
	}
	return 0;
}

提交记录

D

这个\(D\)就是无脑爆拆数学题了
首先前缀和惯例就是拆成\((1,l-1)\)和\((1,r)\)两部分做差
然后考虑\((1,x)\)的部分
由于\(\sum\limits^{x}_{i=1}b_i\)这个形式不太好做
我们倾向于拆成整的\(\sum\limits^{a}_{i=1}\sum\limits^{n}_{j=i}S(i,j)\)和零的\(\sum\limits^{c}_{i=a+1}S(a+1,i)\)两部分
发现第一部分的第二层累加和第二部分累加相似,
所以用前缀和方式预处理第一部分的第一层累加,从而预处理第一部分
接下来考虑第二部分,还是前缀和化法
(对于这一部分,\(x\)和\(y\)都是参数,视情况填入\(1\)或\(n\)或其他)
\(\sum\limits^{y}_{i=x}S(x,i)\\=\sum\limits^{y}_{i=x}(s_{i}-s_{x-1})\\=(\sum\limits^{y}_{i=x}s_i)-(y-x+1)*s_{x-1}\)
再来个数组\(T\)维护\(s\)的前缀和,也就是\(T_{y}-T_{x-1}=(\sum\limits^{y}_{i=x}s_i)\)即可
剩下的就是填参数的事了

点击查看代码

E

标签:Educational,limits,int,sum,元素,CF,ans,配对,171
From: https://www.cnblogs.com/2K22/p/18522227

相关文章

  • CF1856
    总结\(t1\)看起来好简单啊,\(5min\)切了。\(t2\)看起来好简单啊,\(15min\)切了。\(t3\)看起来好难啊,\(50min\)跳了。一开始想到了二分答案,迟迟想不到\(O(n)\)的\(check\),于是思维开始发散,从贪心想到\(dp\)。考完发现大家都是\(O(n^2)\)的\(check\),wssb。\(t4\)......
  • UcOs-III 源码阅读: os_cfg_app.c
    /*uC/OS-IIITheReal-TimeKernelCopyright2009-2022SiliconLaboratoriesInc.www.silabs.comSPDX-License-Identifier:AP......
  • CF2023C Trinity
    CF2023CTrinity一道很好的思维题,当然也是令我痛心疾首。本来这场都不打算做,看了看C觉得很有思路,于是先交了一发,结果WA了,但是为时已晚,只能硬着头皮把剩下的题交完,结果B题wa了五发,典中典之抽象王,直接扣回老家。分析显然的是如果要判断一个序列是否合法,只需要排序过后取两个最小......
  • CF1848B Vika and the Bridge
    思路:注意看,只有一次改变颜色,不要再苦苦打二分了!贪心地去求答案,对于每一种颜色记录两个点之间的距离的最大值和次大值,然后把最大值的那段区间的中点颜色更改成当前颜色。令最大值为maxx,次大值为max2。则min(⌊maxx/2​⌋,max2)  即为最优解。记得处理到n+1 号点的距......
  • CF573D Bear and Cavalry
    原题链接比较简单的\(\text{dp}\)题。看见题目的\(\sumw_ih_i\)式子,很容易想到排序不等式,所以我们先对\(w,h\)排序,然后分情况讨论。若\(w_i,h_i\)对应的编号不相等,肯定是把它们配对。若\(w_i,h_i\)对应的编号相等,考虑这样的连法:若是这种情况也不合法,或者它......
  • CF2026 (Educational round 171) vp记录
    EducationalCodeforcesRound171vp记录A.PerpendicularSegments4min+0唐题。一眼限制紧的边必然连对角线,因为最小长度的限制是相同的所以另一条边也连对角线即可。B.BlackCells9min+0唐题。显然最优策略是相邻的点匹配,$n$为奇数的情况有一个孤立点随便连,为......
  • Educational Codeforces Round 20 E. Roma and Poker
    差分约束我们记W表示\(1\),L表示\(-1\),D表示\(0\),然后记前\(i\)位的前缀和是\(dis[i]\)。则我们可以根据题面得到如下约束。当前位是W,则有\[\left\{\begin{matrix}dis[i]-dis[i-1]\le1\\dis[i-1]-dis[i]\le-1\end{matrix}\right.\]当前位是L,则有\[\left\{\begin{m......
  • 华为云开源项目Sermant正式成为CNCF官方项目
    近日,云原生计算基金会(CNCF)正式接纳由华为云发起的云原生无代理服务网格项目Sermant。Sermant的加入,极大地丰富了云原生微服务治理技术的探索、创新和发展,为CNCF社区注入了新的活力。 Sermant是华为云在微服务治理技术领域多年的技术积累和丰富的实践经验孵化而来,致力于解决大......
  • 10_31_cf训练
    10.31_CF_刷题B.KarSalesman思路一个顾客一种型号的车只能买一个,所以\(a_i\)号车需要\(a_i\)个顾客,所以至少需要\(max(a_i)\)个顾客,把所有车买完至少\(\frac{sum}{x}\)个顾客,所以取两者最大值就好也就是说,先用比较少的去消耗比较多的,避免最后只剩下比较多的那种车如果最多......
  • ACCFIN5242 Moodle Discussion Forum
    AssessmentBrief2024/2025Pleasemakesureyoucarefullyreadandunderstandthequestionortask.Ifyouhaveunansweredquestions,pleaseposttheseonthecourseMoodleDiscussionForum,andwe’llrespond.  AssignmentInformationCourseCodeA......