【牛客训练记录】牛客小白月赛109
训练情况
赛后反思
C题想复杂了,以为是神必数据结构,前缀和差分,树状数组,线段树都想了一遍,没想到是维护暴力跳。。。
A题
$ x+(19260817) \ge n−(114514) $ 移项可知 \(x + 19375332 \ge n\),答案最大值只能取到 19375332
,大于这个数答案还是 19375332
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int x; cin>>x;
x = min(19375332ll,x);
cout<<x<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
B题
诈骗题,\(k_1,k_2\) 没有用,因为数据范围保证至少能选一个,那只选一个数,那个数就是中位数,要想能赢,只需要把数列中的最大值划分给自己,只选择那个最大值即可,因为划分出来的区域不能为空,所以只要最大值不在最后一个就必胜。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,k1,k2; cin>>n>>k1>>k2;
vector<int> a(n + 1);
for(int i = 1;i<=n;i++) cin>>a[i];
int ma = 0;
for(int i = 1;i<=n;i++) ma = max(ma,a[i]);
if(a[n] == ma) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
C题
暴力模拟+小优化,维护一下已经计过数位置的下一个位置,跳到那一次维护的右边界即可。
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,q; cin>>n>>q;
vector<int> a(n + 1);
vector<int> s(n + 1);
int tot = 0;
while(q--){
int opt; cin>>opt;
if(opt == 1){
int l,r; cin>>l>>r;
for(int i = l;i<=r;i++){
if(a[i]) i = s[i];
else a[i] = ++tot,s[i]=r;
}
} else if(opt == 2){
int x; cin>>x;
cout<<a[x]<<endl;
}
}
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话