# 洛谷P2672 推销员

noip2015普及 T4

 1 #include <bits/stdc++.h>
2 #define LL long long
3 #define GG LL
4 #define For(i, j, k) for(register int i=j; i<=k; i++)
5 #define Dow(i, j, k) for(register int i=j; i>=k; i--)
6 using namespace std;
8     GG x = 0, f = 1;
9     char ch = getchar();
10     while(ch<'0'||ch>'9') { if(ch=='-') f = -1; ch = getchar(); }
11     while(ch>='0'&&ch<='9') { x = x*10+ch-48; ch = getchar(); }
12     return x * f;
13 }
14 void write(GG x) {
15     if(x<0) putchar('-'), x = -x;
16     if(x>9) write(x/10);
17     putchar(x%10+48);
18 }
19 inline void writeln(GG x) { write(x); putchar('\n'); }
20
21 const int N = 100011;
22 int n;
23 struct node{
24     int id;
25     LL val;
26     friend bool operator <(node a, node b) {
27         return a.val < b.val;
28     }
29 };
30 struct arr{
31     int pos;
32     LL val;
33 }a[N];
34 LL ans;
35
36 bool cmp_pos(arr a, arr b) {
37     return a.pos < b.pos;
38 }
39
40 priority_queue<node> Ql;
41 priority_queue<node> Qr;
42
43 inline void work() {
44     int mid = 0;
45     LL Mx = -1;
46     For(i, 1, n)
47         if(2ll*a[i].pos+a[i].val > Mx) {
48             Mx = 2ll*a[i].pos+a[i].val;
49             mid = i;
50         }
51     ans = 2ll*a[mid].pos+a[mid].val;
52     writeln(ans);
53     For(i, 1, mid-1) Ql.push( (node){i, a[i].val } );
54     For(i, mid+1, n) Qr.push( (node){i, 2ll*a[i].pos+a[i].val } );
55     For(i, 2, n) {
56         int l, r;  LL M1, M2;
57         if(!Ql.empty()) l = Ql.top().id;
58         else l = -1;
59         while(!Qr.empty() && a[mid].pos > a[Qr.top().id].pos) Qr.pop();
60         if(!Qr.empty()) r = Qr.top().id;
61         else r = -1;
62         M1 = a[l].val; M2 = 2ll*a[r].pos+a[r].val-2ll*a[mid].pos;
63         if(l!=-1 && (r==-1 || M1 > M2)) {
64             ans += M1;
65             Ql.pop();
66         }
67         else {
68             ans += M2;
69             For(i, mid+1, r-1) Ql.push( (node){ i, a[i].val} );
70             Qr.pop();
71         }
72         writeln(ans);
73     }
74 }
75
76 int main() {
82 }