Educational Codeforces Round 42 (Rated for Div. 2) D - Merge Equals
阿新 • • 發佈:2018-04-16
cond ons 直接 can end 開始 cstring type Education
這道題我可以直接模擬
理由是一個數*2的過程中最多30次左右
2^31 = 2e9
所以我可以從小的書開始模擬這個過程
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <map> #include <vector> #include <set> typedef long long ll; const int N = 150005; const int INF = 0x3f3f3f3f; int A[N]; std::map<ll, std::set<int> > mp; std::map<int, ll> ans; int main() { int n; while(~scanf("%d", &n)) { mp.clear(); ans.clear(); for(int i = 0; i < n; ++i) scanf("%d", &A[i]); for(int i = 0; i < n; ++i) { mp[A[i]].insert(i); } for(auto i = mp.begin(); i != mp.end(); ++i) { std::set<int> &target = i->second; int cnt = 0; int last; for(auto j = target.begin(); j != target.end(); ++j) { cnt ++; if(cnt % 2 == 0) { mp[i->first * 2].insert(*j); } last = *j; } if(cnt % 2) ans[last] = i->first; } printf("%d\n", (int)ans.size()); for(auto i = ans.begin(); i != ans.end(); ++i) { printf("%lld ", i->second); } printf("\n"); } return 0; }
Educational Codeforces Round 42 (Rated for Div. 2) D - Merge Equals