abc440 赛后总结
这次比赛就水了半小时就去搞whk了....
🎯 比赛概况
- 比赛:AtCoder Beginner Contest 440
- 最终排名:1330/10207人(前 13%)
- Rating 变化:+212(显著进步!)
- 完成题数:4/7(A-D)
- 最大亮点:所有提交均一次 AC,无罚时获得了 \(rank 1330\) 的成绩对于我本人来说已经心满意足了。

题目讲解
A-Octave
很水的一道题目啊,我们直接模拟就可以了。时间复杂度是 \(O(y)\) 的,你要是乐意也可以使用位运算那样就是 \(O(1)\) 的。
Accode
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define i128 __int128
#define ld long double
#define fir first
#define sec second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define lowbit(x) (x&-x)
using namespace std;
const int MOD=998244353;
const int MOD1=1e9+7;
//char ibuf[1<<25],*p1=buf,*p2=buf;
mt19937 mrand(random_device{}());
int rnd(int x){ return mrand() % x;}
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%MOD;a=a*a%MOD,b>>=1;}return res;}
ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}
//C++ 17 -O2
//By MaZhaoze
int main(){
int x,y;
cin>>x>>y;
for(int i=0;i<y;i++){
x=x*2;
}
cout<<x;
return 0;
}
B-Trifecta
题目简易:给你一个数组,把他排序一遍然后输出前三个原本的下标。
我的做法就是使用一个数据结构把下标和速度捆绑一下就可以了还是十分水的。时间复杂度应该是 \(O(n \log n)\) ,对于本题显然足够优。
Accode
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define i128 __int128
#define ld long double
#define fir first
#define sec second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define lowbit(x) (x&-x)
using namespace std;
const int MOD=998244353;
const int MOD1=1e9+7;
//char ibuf[1<<25],*p1=buf,*p2=buf;
mt19937 mrand(random_device{}());
int rnd(int x){ return mrand() % x;}
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%MOD;a=a*a%MOD,b>>=1;}return res;}
ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}
//C++ 17 -O2
//By MaZhaoze
struct B_Trifecta
{
int t,id;
};
bool cmp(B_Trifecta a,B_Trifecta b){
return a.t<b.t;
}
int main(){
int n;
cin>>n;
vector<B_Trifecta> t(n);
for(int i=0;i<n;i++) {
cin>>t[i].t;
t[i].id=i+1;
}
sort(t.begin(),t.end(),cmp);
cout<<t[0].id<<' '<<t[1].id<<' '<<t[2].id;
return 0;
}
C-Striped Horse
我的做法就是使用滑动窗口把他扫一遍就可以了,时间复杂度是
\[O\left(\sum_{i=1}^{T} N_i + \sum_{i=1}^{T} W_i\right)
\]
还是十分优秀的。
Accode
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define i128 __int128
#define ld long double
#define fir first
#define sec second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define lowbit(x) (x&-x)
using namespace std;
const int MOD=998244353;
const int MOD1=1e9+7;
//char ibuf[1<<25],*p1=buf,*p2=buf;
mt19937 mrand(random_device{}());
int rnd(int x){ return mrand() % x;}
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%MOD;a=a*a%MOD,b>>=1;}return res;}
ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}
//C++ 17 -O2
//By MaZhaoze
int main(){
int t;
cin>>t;
while(t--){
int n,w;
cin>>n>>w;
vector<ll> c(n);
for(int i=0;i<n;i++) cin>>c[i];
if(n<=w){
cout<<0<<'\n';
continue;
}
int M=2*w;
vector<ll> r(M);
for(int i=0;i<n;i++){
int m=(i+1)%M;
r[m]+=c[i];
}
ll cz=0;
for(int i=0;i<w;i++){
cz+=r[i];
}
ll ans=cz;
for(int i=0;i<M;i++){
cz-=r[i];
cz+=r[(i+w)%M];
ans=min(ans,cz);
}
cout<<ans<<'\n';
}
return 0;
}
D-Forbidden List 2
我们读题,考虑打暴力那么时间复杂度就是 \(O(q\times n \times y)\) 肯定会超时。
所有我们考虑更优的做法也就是二分答案,显然答案是具有单调性的。那么二分答案的时间复杂度就是 \(O(q\times \log(y+n)\times \log(n))\),对于本题来说已经足够。
我们首先对 \(a\) 数组来个排序然后二分答案就可以了。
Accode
#include<bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define uint unsigned int
#define i128 __int128
#define ld long double
#define fir first
#define sec second
#define pii pair<int,int>
#define pll pair<ll,ll>
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define lowbit(x) (x&-x)
using namespace std;
const int MOD=998244353;
const int MOD1=1e9+7;
//char ibuf[1<<25],*p1=buf,*p2=buf;
mt19937 mrand(random_device{}());
int rnd(int x){ return mrand() % x;}
ll qpow(ll a,ll b){ll res=1;while(b){if(b&1)res=res*a%MOD;a=a*a%MOD,b>>=1;}return res;}
ll gcd(ll a,ll b){ return b?gcd(b,a%b):a;}
//C++ 17 -O2
//By MaZhaoze
int main(){
int n,q;
cin>>n>>q;
vector<int> A(n);
for(int i=0;i<n;i++) cin>>A[i];
sort(A.begin(),A.end());
while(q--){
ll X,Y;
cin>>X>>Y;
ll left=X;
ll right=X+Y+n+2;
ll ans=right;
while (left<=right) {
ll mid = left+(right-left)/2;
ll all = mid-X+1;
auto al=lower_bound(A.begin(),A.end(),X);
auto ar=upper_bound(A.begin(),A.end(),mid);
ll isin=ar-al;
ll nil=all-isin;
if (nil >= Y) {
ans=mid;
right=mid-1;
} else {
left = mid+1;
}
}
cout<<ans<<'\n';
}
return 0;
}
然后啊然后就不会了....

浙公网安备 33010602011771号