【牛客訓練記錄】浙江機電職業技術大學第九屆程式設計競賽

MNNUACM_2024ZY發表於2024-12-08

訓練情況

賽後反思

還得是 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;
}

相關文章