公式
C - Upgrade Required 解説 by en_translator
This editorial introduces a solution running in \(O(N+Q)\) time.
There are various other approaches (including those with slightly worse complexity).
First, let us consider what happens when PCs with version \(X\) or prior is upgraded to version \(Y\):
- Let \(O\) be the oldest among the current versions. Then all PCs with versions between \(O\) and \(X\) will be upgraded.
- Since the constraints guarantee \(X<Y\), as a result of this upgrade, there will no longer be a PC of version \(X\) or prior.
- For the later upgrades, \(O\) is always \(X+1\) or greater.
This suggests that we can process upgrades fast by tracking the oldest version \(O\).
Thus we obtain the following solution:
- First, the oldest version is \(O=1\).
- For \(i=1,2,\dots,Q\) in order, perform the \(i\)-th operation.
- If \(X_i < O\), there is no PC with version \(X_i\) or prior, so skip this operation.
- Otherwise, repeat the following while \(O \le X_i\).
- Upgrade all PCs with version \(O\) to \(Y_i\).
- Then, let \(O \rightarrow O+1\).
This solution can be implemented by combining arrays with loops.
Sample code (C++):
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,q;
cin >> n >> q;
vector<int> pc(n+1,1);
pc[0]=0;
int o=1;
while(q--){
int x,y;
cin >> x >> y;
int res=0;
while(o<=x){
res+=pc[o];
pc[y]+=pc[o];
o++;
}
cout << res << "\n";
}
return 0;
}
投稿日時:
最終更新: