首页 > 其他分享 >AtCoder Beginner Contest 388 (abc388) 赛后复盘

AtCoder Beginner Contest 388 (abc388) 赛后复盘

时间:2025-01-12 09:10:37浏览次数:1  
标签:AtCoder Beginner Contest int res memset read mod define

为什么不会 E????

A - B

模拟即可。

C

每一个大麻薯可以和所有小于等于自己 \(\frac12\) 的麻薯结合,二分即可。

时间复杂度 \(O(n \log n)\)。

点击查看代码
#include<bits/stdc++.h>

#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 500050

int n,a[maxn],b[maxn];

void work() {
	in1(n);
	For(i,1,n) in1(a[i]);
	priority_queue<int,vector<int>,greater<int> > q;
	For(i,1,n) {
		while(q.size()&&q.top()<i) q.pop();
		a[i]+=q.size();
		b[i]=max(0,a[i]-(n-i));
		q.push(a[i]+i);
	}
	For(i,1,n) cout<<b[i]<<' ';
}

signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	int _=1;
//	_=read();
	For(i,1,_) {
		work();
	}
	return 0;
}

D

可能是一个比较神秘的做法(?

首先我们知道每个人都只会收到别人爆的一次金币,所以我们可以维护一个小根堆,每一次把收到钱的人推入小根堆。
假设第 \(i\) 个人要爆出 \(i\) 分钱,所以每一次就把不符合条件的人给丢出小根堆。
把人推入堆中时要注意因为我们刚刚默认了每个人都已经报爆了 \(i\) 次金币,所以入队时推的是 \(a_i+i\)。
至于输出,因为每个人只会拿到一次金币,所以我们可以在知道他最多钱的时候就立马算出来他最后的金币有多少,即 \(\max(0,a_i-(n-i))\)。

点击查看代码
#include<bits/stdc++.h>

#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 500050

int n,a[maxn],b[maxn];

void work() {
	in1(n);
	For(i,1,n) in1(a[i]);
	priority_queue<int,vector<int>,greater<int> > q;
	For(i,1,n) {
		while(q.size()&&q.top()<i) q.pop();
		a[i]+=q.size();
		b[i]=max(0,a[i]-(n-i));
		q.push(a[i]+i);
	}
	For(i,1,n) cout<<b[i]<<' ';
}

signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	int _=1;
//	_=read();
	For(i,1,_) {
		work();
	}
	return 0;
}

E

傻福题,真的是冯了个福的。

二分最后的答案(单调性显然),每一次判定 \(x\) 是否可行只需要看前 \(x\) 个和后 \(x\) 个是否可以匹配。最小的和最小的匹配,最大的和最大的匹配(两个 分别指的是:前 \(x\) 个和后 \(x\) 个)即可,正确性显然。时间复杂度 \(O(n \log n)\)。

点击查看代码
#include<bits/stdc++.h>

#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 500050

int n,a[maxn];

bool check(int x) {
	For(i,1,x) if(a[i]*2>a[n-x+i]) return 0;
	return 1;
}

void work() {
	in1(n);
	For(i,1,n) in1(a[i]);
	int l=0,r=n/2;
	while(l<r) {
		int mid=l+r+1>>1;
		if(check(mid)) l=mid;
		else r=mid-1;
	}
	cout<<l;
}

signed main() {
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	int _=1;
//	_=read();
	For(i,1,_) {
		work();
	}
	return 0;
}

标签:AtCoder,Beginner,Contest,int,res,memset,read,mod,define
From: https://www.cnblogs.com/CodingGoat/p/18666562

相关文章

  • HHKB Programming Contest 2025(AtCoder Beginner Contest 388)
    A-?UPC题意:给你一个字符串,把他的第一个字符和"UPC"输出。输出即可。点击查看代码voidsolve(){std::strings;std::cin>>s;std::cout<<s[0]<<"UPC\n";}B-HeavySnake题意:n条蛇由厚度和长度,重量为厚度乘长度,问长度加上1~k时,最大的蛇的重量分别......
  • AtCoder Beginner Contest 387
    A-HappyNewYear2025题意给定正整数\(A,B\),求\((A+B)^2\)思路模拟代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ inta,b; cin>>a......
  • VP UNIQUE VISION Programming Contest 2024 Christmas (AtCoder Beginner Contest 38
    A-Equally题意:给你三个数,判断能不能分成大于一组后每组和相等。只可能分成两个和一个或者三组一个的。点击查看代码voidsolve(){inta,b,c;std::cin>>a>>b>>c;if((a==b&&b==c)||(a+b==c)||(b+c)==a||(a+c)==b){ s......
  • cf-800 a b c:https://codeforces.com/contest/1694
    cf-800链接:https://codeforces.com/contest/1694题a正常循环输入01,多的最后输入就行你要的代码在这里usingnamespacestd;typedeflonglongll;intmain(){intu;cin>>u;while(u--){inta,b;cin>>a>>b;into=abs(a-b);......
  • Atcoder ABC329E Stamp 题解 [ 绿 ] [ 线性 dp ]
    Stamp:难点主要在dp转移的细节与分讨上,但通过改变状态设计可以大大简化分讨细节的题。观察首先要有一个观察:只要某一个前缀能被覆盖出来,那么无论它后面多出来多少,后面的字符串都可以帮他重新覆盖回去。这也就是dp为啥没有后效性的原因。除此之外,还要注意一个字符串不仅能在......
  • VP AtCoder Beginner Contest 387
    A-HappyNewYear2025按题意输出即可。点击查看代码voidsolve(){inta,b;std::cin>>a>>b;std::cout<<(a+b)*(a+b)<<"\n";}B-9x9Sum直接遍历累加满足不等于x的数即可,注意这个九九乘法表是9*9的矩阵,不是我们学的下三角。点击查看......
  • AtCoder备赛刷题 ABC 361 | x = a^b
    学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AtCoder备赛刷题|汇总【ProblemStatement】Howmanyintegersxx......
  • AtCoder备赛刷题 ABC 361 | Go Territory
    学习C++从娃娃抓起!记录下AtCoder(日本算法竞技网站)备赛学习过程中的题目,记录每一个瞬间。附上汇总贴:AtCoder备赛刷题|汇总【ProblemStatement】ThereareNNNston......
  • atcoder 杂题 #05
    atcoder杂题#05abc340_gLeafColorabc340_fF-S=1abc361_gGoTerritoryabc386_fOperateKabc340_g独立想出了这道题。如果我们确定了子图的叶子,那么这个子图就确定了。又由于叶子的颜色要相同,所以每种颜色的贡献是互相独立的。首先如果一种颜色有\(x\)个点,那......
  • 2025 AtCoder 周寄
    目录前言\(\text{\color{#0000FF}ABC387\color{black}perf\color{#00C0C0}1398}\)前言赛时总结展望前言2024拜拜了。回首整个2024的OI历程,自己一直在摆烂。8月份的暑假基本没碰过OI,10月底的CSP-J255pts遗憾2=,11月底的NOIP连T3暴力都没来得及打,年底五中请lx......