首页 > 其他分享 >ABC388

ABC388

时间:2025-01-13 10:21:47浏览次数:1  
标签:糕点 int mid 差分 include 500005 ABC388

好像已经很久没有写过题解了

C

link

对于每一个糕点,二分查找大于等于它大小的二倍的糕点的位置(可以用\(lower_{}bound\)函数),从这个位置到\(n\)就是可以和这个糕点配对的糕点。

猜猜我是啥
#include<bits/stdc++.h>

#define int long long

using namespace std;

int n;
int a[500005];
int ans;

signed main(){
	
	cin >> n;
	for(int i = 1;i <= n;++ i)
		cin >> a[i];
	
	for(int i = 1;i <= n;++ i){
		int w = a[i]*2;
		int wz = lower_bound(a+1,a+1+n,w)-a;
		ans += n-wz+1;
	}
	
	cout << ans;
	
	return 0;
	
}

D

link

设\(d_i\)为\(i\)成年时有的石头数。
首先我们可以得出,石头只会从前往后送;而且我们还可以得出,\(i\)成年后一共会送出\(min(a_i,n-i)\)个石头,也就是会让\(i+1\)到\(i+min(a_i,n-i)\)这些人的石头数加一。
我们知道,区间加一可以用差分,可是差分要全做完之后做前缀和才能知道结果,怎么办呢?我们知道如果一个数成年了就不会再得到石头了,也就是说当我们需要知道\(d_i\)时,它就不会再改变了,那么我们就可以边差分边前缀和,做到哪一个需要它了就算到这个的前缀和,后面还是用差分去做区间加一。

猜猜我是啥
#include<bits/stdc++.h>

using namespace std;

int n;
int a[500005];
int cf[500005];

signed main(){
	
	cin >> n;
	for(int i = 1;i <= n;++ i)
		cin >> a[i],cf[i] = a[i]-a[i-1];
	
	for(int i = 1;i <= n;++ i){
		a[i] = cf[i-1]+cf[i];
		cf[i] += cf[i-1];
		int w = min(a[i],n-i);
		cf[i+1]++;
		cf[i+w+1]--;
		a[i] -= w;
	}
	
	for(int i = 1;i <= n;++ i)
		cout << a[i] << " ";
	
	return 0;
	
}

E

link

二分答案,对于一个答案\(x\),我们考虑从前面选\(x\)个(最小的\(x\)个),从后面选\(x\)个(最大的\(x\)个),看看可不可以组起来(最小中最小的和最大中最小的组起来一直到最小中最大的和最大中最大的组起来),如果可以,就更大一些,如果不行就小一些。

猜猜我是啥
#include<bits/stdc++.h>

using namespace std;

int n;
int a[500005];

bool check(int x){
	for(int i = 1,j = n-x+1;i <= x;++ i,++ j){
		if(a[i]*2 > a[j]) return false;
	}
	return true;
}

signed main(){
	
	cin >> n;
	for(int i = 1;i <= n;++ i)
		cin >> a[i];
	
	int l = 0,r = n/2;
	while(l < r){
		int mid = (l+r+1)/2;
		if(check(mid)) l = mid;
		else r = mid-1;
	}
	cout << l;
	
	return 0;
	
}

标签:糕点,int,mid,差分,include,500005,ABC388
From: https://www.cnblogs.com/wmmdbk/p/18668055

相关文章

  • ABC388DEG 题解
    ABC388题解ABCDE+G,rk371。D观察到几个性质:一个人只会在成年的时候得到石头,在成年之后给出石头。第\(i\)个人成年之后,他要给之后的每个人一个石头(除非用光了)。也就是说,假设成年时它的石头数量为\(B_i\),则最终他的石头数量为\(\max(0,B_i-(n-i))\)。因此我们只需......
  • AT_abc388_f Dangerous Sugoroku 题解
    太幽默了。显然可以用矩阵快速幂解决,矩阵里维护距离当前点\(B\)以内的所有点可不可达,转移只需分段,在区间内和不在区间内用不同的转移矩阵即可。复杂度\(O(B^3m\logn)\)。然后你就T了。此时你很急,你现在应该快点卡常来AK这场比赛而不是研究其他的做法,于是我们发现快速幂......
  • Atcoder ABC388F Dangerous Sugoroku 题解 [ 蓝 ] [ 矩阵加速 ] [ 状压矩乘 ] [ 模拟
    DangerousSugoroku:赛时写了矩乘T飞了,受到sunkuangzheng大佬的启发才知道要状压矩乘。暴力矩乘思路直接像过河那样写模拟细节非常多,于是考虑像美食家一样的思路,利用矩阵分段加速。定义\(dp_i\)表示\(i\)能否到达,则有如下转移:\[dp_{i}=\bigvee_{j=i-B}^{i-A}dp_{j}\]......
  • 题解:AT_abc388_g [ABC388G] Simultaneous Kagamimochi 2
    鉴于本题解书写时洛谷题面暂无中文翻译,为避免可能的歧义或困惑,先对本题解中的译法进行约定:(顺便吐槽音译怪)英文题面中“mochi”或日文题面中“餅”译为“饼”。英文题面中“kagamimochi”或日文题面中“鏡餅”译为“镜饼”。鉴于本题是C和E的加强版,而我懒得去写那两题的题......
  • AtCoder Beginner Contest 388 (abc388) 赛后复盘
    为什么不会E????A-B模拟即可。C每一个大麻薯可以和所有小于等于自己\(\frac12\)的麻薯结合,二分即可。时间复杂度\(O(n\logn)\)。点击查看代码#include<bits/stdc++.h>#definelllonglong#definei128__int128#definemem(a,b)memset((a),(b),sizeof(a))#def......
  • ABC388-VP赛总结-A/B(日结)
    首先A题(一个difficultly为21的题卡了我20分钟)ProblemStatementYouaregivenanon-emptystring\(S\)consistingofuppercaseandlowercaseEnglishletters.Determinewhetherthefollowingconditionissatisfied:Thefirstcharacterof\(S\)isuppercase,and......