P1631-序列合并
1 #include <bits/stdc++.h> 2 #define _for(i,a,b) for(int i = (a);i < b;i ++) 3 #define _rep(i,a,b) for(int i = (a);i > b;i --) 4 #define INF 0x3f3f3f3f 5 #define MOD 1000000007 6 #define pb push_back 7 #define maxn 100003 8 typedef long long ll; 9 using namespace std; 10 inline ll read() 11 { 12 ll ans = 0; 13 char ch = getchar(), last = ' '; 14 while(!isdigit(ch)) last = ch, ch = getchar(); 15 while(isdigit(ch)) ans = (ans << 1) + (ans << 3) + ch - '0', ch = getchar(); 16 if(last == '-') ans = -ans; 17 return ans; 18 } 19 inline void write(ll x) 20 { 21 if(x < 0) x = -x, putchar('-'); 22 if(x >= 10) write(x / 10); 23 putchar(x % 10 + '0'); 24 } 25 int N; 26 struct P 27 { 28 int k; 29 int val; 30 }; 31 struct cmp 32 { 33 bool operator () (P a,P b) 34 { 35 return a.val > b.val; 36 } 37 }; 38 priority_queue<P,vector<P>,cmp> pq; 39 int a[maxn]; 40 int b[maxn]; 41 int k[maxn]; 42 int main() 43 { 44 N = read(); 45 _for(i,1,N+1) 46 a[i] = read(); 47 _for(i,1,N+1) 48 b[i] = read(); 49 50 _for(i,1,N+1) 51 { 52 pq.push({i,a[i]+b[1]}); 53 k[i] = 1; 54 } 55 56 _for(i,1,N+1) 57 { 58 P ans = pq.top(); 59 pq.pop(); 60 printf("%d ",ans.val); 61 k[ans.k] ++; 62 pq.push({ans.k,a[ans.k]+b[k[ans.k]]}); 63 } 64 return 0; 65 }