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

训练情况

赛后反思

还得是 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;
}
posted @ 2024-12-08 14:13  MNNUACM_2024ZY  阅读(43)  评论(0)    收藏  举报