CF962D Merge Equals
阿新 • • 發佈:2018-04-14
time using 序列 () 題意 roman color als n)
鏈接:
http://codeforces.com/problemset/problem/962/D
題意:給出一個整數序列。選擇其中最小且出現兩次及以上的數,把左邊第一個加到左邊第二個上,
再去掉左邊第一個,不斷重復上述過程,直到序列中的每個數都是唯一的,輸出最後的序列。
分析:“每次選擇最前面兩個最小的數合並”<=>“每次選擇最前面兩個數合並”
#include<cstdio> #include<map> #include<algorithm> #include<cstring> using namespace std; longView Codelong a[300000]; map<long long,int> m; int main() { int N,cnt=0; scanf("%d",&N); for(int i=1;i<=N;i++) { scanf("%lld",&a[i]); while(m[a[i]]) { a[m[a[i]]]=0; m[a[i]]=0; a[i]*=2; cnt++; } m[a[i]]=i; } printf("%d\n",N-cnt); for(int i=1;i<=N;i++) if(a[i]) printf("%lld ",a[i]); return 0; }
CF962D Merge Equals