訓練情況
賽後反思
還得是 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;
}