今日は余力があるので2記事目の更新です。
ここで取り扱う問題はこちら。
提出コードと考え方
ある問題でACが出るまでのWA数を問題ごとにカウントして、ACが出たときにそれを正答数、ペナルティに加えるのが方針です。
ACが出た後は同じ問題でペナルティをもらったり、正答数が増えることはないのでカウンターに特別な値を入れておいて、それ以降は無視するように処理を書きます。
提出コードではmapを使っています。
WAを出さずにACをする場合、存在しないキーを指定することになり大丈夫か、と思うかもしれませんが、実際には型ごとのデフォルトの値をvalueとする要素が追加されます。(数値型なら0です。)
#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i = 0;i < n;i++)
int main() {
int n, m;
cin >> n >> m;
vector<pair<int,string>> sub(m);
rep(i,m) cin >> sub[i].first >> sub[i].second;
int ac = 0, pena = 0;
map<int,int> mp;
rep(i,m) {
int p = sub[i].first;
string s = sub[i].second;
if(mp[p] == -1) continue;
if(s == "WA"){
mp[p]++;
} else {
ac++;
pena += mp[p];
mp[p] = -1;
}
}
cout << ac << " " << pena << endl;
}
問題番号が高々10**5程度なのでmapを使わずvectorでbacketのようにしてもよさそうですね(1/log nだけ早くなる)