【牛客训练记录】浙江机电职业技术大学第九届程序设计竞赛
训练情况

赛后反思
还得是 ZJ 爷上强度,全场只会两题,还是太菜了
A题
每个人可以发起两次拼团,每个人只能接受一次别人的拼团,因为每个人都可以发起拼团,并且有两次机会,所以我们可以不用在意发起拼团的限制,自己机会用完了可以让别人发起,所以我们只需要计算剩余的 \(2\) 个人有多少对,每一对可以拿到 \(3\) 份饭。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int x; cin>>x;
if(x<=2) cout<<0<<endl;
else cout<<x/2*3<<endl;
}
signed main(){
int T; cin>>T; while(T--)
solve();
return 0;
}
J题
区间加等差数列,有点类似于洛谷三步必杀的那道原题,我们考虑进行两次差分和两次前缀和,等差数列差分完是连续的 \(1\),再进行一次差分就可以做到 \(O(1)\) 修改,查询的答案做两遍前缀和即可。
#include <bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
void solve(){
int n,m; cin>>n>>m;
vector<int> a(n + 3);
vector<int> b(n + 3);
for(int i = 1;i<=m;i++){
int l,r; cin>>l>>r;
b[l]++;
b[r+1]--;
a[r+1]-=(r-l+1);
}
for(int i = 1;i<=n;i++) b[i] += b[i-1];
for(int i = 1;i<=n;i++) a[i] += b[i];
for(int i = 1;i<=n;i++) a[i] += a[i-1];
for(int i = 1;i<=n;i++) cout<<a[i]<<" ";
}
signed main(){
// int T; cin>>T; while(T--)
solve();
return 0;
}

浙公网安备 33010602011771号