Codeforces 962D Merge Equals
Determine how the array will look after described operations are performed.For example, consider the given array looks like [
It will be changed in the following way: [3,4,1,2,2,1,1]→[3,4,2,2,2,1]→[3,4,4,2,1]→[3,8,2,1].If the given array is look like [1,1,3,1,1],it will be changed in the following way: [1,1,3,1,1]→[2,3,1,1]→[2,3,2]→[3,4].
InputThe first line contains a single integer n(2≤n≤150000) — the number of elements in the array.
The second line contains a sequence from nelements a1,a2,…,an (1≤ai≤109) — the elements of the array.
OutputIn the first line print an integer k— the number of elements in the array after all the performed operations. In the second line print k integers — the elements of the array after all the performed operations.
7 3 4 1 2 2 1 1Output
4 3 8 2 1Input
5 1 1 3 1 1Output
2 3 4Input
5 10 40 20 50 30Output
5 10 40 20 50 30Note
The first two examples were considered in the statement.
In the third example all integers in the given array are distinct, so it will not change.
題意:給你n個數,然後如果同一個數出現過兩次或者多次的話,就把兩個數求和,並放在兩個數的右邊。然後問你最終的那個數列的順序。
解題思路:
一開始看這個題目的時候,我的第一反應就是優先佇列,因為最近剛結束的團隊天梯賽裡就有一道這樣的題,只是稍微變形了求法。
我們把每一個輸入的元素加入下標,如果兩個數相等,那麼就優先輸出最開始輸入的那兩個,如果兩個數不相等,那麼就把最小的那個先記錄下來,然後把另一個壓回到優先佇列中。因為有可能組成另一個稍微大點的值。然後就是兩個數合併過程和輸出記錄過程。
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
const int inf=0x3f3f3f3f;
const int maxn=3e5+10;
typedef struct Node{
long long sum,pos;
bool operator < (const Node &a) const {
if(a.sum==sum)
return a.pos<pos;
return a.sum<sum;
}
}node;
struct query{
long long sum,pos;
}edge[maxn];
priority_queue<node> qu;
bool cmp(query a,query b){
return a.pos<b.pos;
}
long long num,n;
int main(){
int i,j;
scanf("%I64d",&n);
node no,po;
while(!qu.empty()) qu.pop();
for(i=1;i<=n;i++){
scanf("%I64d",&num);
no.pos=i;no.sum=num;
qu.push(no);
}
long long tot=0;
while(!qu.empty()){
if(qu.size()==1){
no=qu.top();qu.pop();
edge[tot].sum=no.sum;
edge[tot++].pos=no.pos;
break;
}
no=qu.top();qu.pop();
po=qu.top(); qu.pop();
if(no.sum==po.sum){
no.sum*=2;
no.pos=max(no.pos,po.pos);
qu.push(no);
}
else{
edge[tot].sum=no.sum;
edge[tot++].pos=no.pos;
qu.push(po);
}
}
sort(edge,edge+tot,cmp);
printf("%I64d\n",tot);
for(i=0;i<tot;i++){
printf("%I64d",edge[i].sum);
if(i!=tot-1)
printf(" ");
}
printf("\n");
return 0;
}
哎,過了D題也掉分,ORZ。難受。