Topic links: https://atcoder.jp/contests/abc127/tasks/abc127_f
Subject to the effect
In the initial state $ f (x) = 0 $, there are two modes of inquiry, first to "1 ab" form, needs to operate $ f (x) = f (x) + | x - a | + b $; in the form of a second "2", so that demand f (x) to obtain the minimum value of x and the value of f (x), if there are a plurality of x, can be any one of the output.
analysis
Consider the first k inquiry there have been times we encounter the second inquiry. At this time, $ f (x) = \ sum_ {i = 1} ^ k (| x - a_i | + b_i) $, $ B_i can be found $ completely independent of x, so long as the discussion $ \ sum_ {i = 1 } ^ k | x - a_i | $ minimum can be.
The question then degenerates to find a point on the number line, so that it and the shortest distance to the given point of k.
When the point number is odd, the median is the optimal solution.
When the number is even the point, the optimal solution is located in the middle of two numbers of any of a take.
When the number is even the point, the optimal solution is located in the middle of two numbers of any of a take.
So the essence of the problem is to allow you to dynamically find the median, median maintenance can double the heap.
code show as below
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define INIT() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); 5 #define Rep(i,n) for (int i = 0; i < (n); ++i) 6 #define For(i,s,t) for (int i = (s); i <= (t); ++i) 7 #define rFor(i,t,s) for (int i = (t); i >= (s); --i) 8 #define ForLL(i, s, t) for (LL i = LL(s); i <= LL(t); ++i) 9 #define rForLL(i, t, s) for (LL i = LL(t); i >= LL(s); --i) 10 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i) 11 #define rforeach(i,c) for (__typeof(c.rbegin()) i = c.rbegin(); i != c.rend(); ++i) 12 13 #define pr(x) cout << #x << " = " << x << " " 14 #define prln(x) cout << #x << " = " << x << endl 15 16 #define LOWBIT(x) ((x)&(-x)) 17 18 #define ALL(x) x.begin(),x.end() 19 #define INS(x) inserter(x,x.begin()) 20 21 #define ms0(a) memset(a,0,sizeof(a)) 22 #define msI(a) memset(a,inf,sizeof(a)) 23 #define msM(a) memset(a,-1,sizeof(a)) 24 25 #define MP make_pair 26 #define PB push_back 27 #define ft first 28 #define sd second 29 30 template<typename T1, typename T2> 31 istream &operator>>(istream &in, pair<T1, T2> &p) { 32 in >> p.first >> p.second; 33 return in; 34 } 35 36 template<typename T> 37 istream &operator>>(istream &in, vector<T> &v) { 38 for (auto &x: v) 39 in >> x; 40 return in; 41 } 42 43 template<typename T1, typename T2> 44 ostream &operator<<(ostream &out, const std::pair<T1, T2> &p) { 45 out << "[" << p.first << ", " << p.second << "]" << "\n"; 46 return out; 47 } 48 49 inline int gc(){ 50 static const int BUF = 1e7; 51 static char buf[BUF], *bg = buf + BUF, *ed = bg; 52 53 if(bg == ed) fread(bg = buf, 1, BUF, stdin); 54 return *bg++; 55 } 56 57 inline int ri(){ 58 int x = 0, f = 1, c = gc(); 59 for(; c<48||c>57; f = c=='-'?-1:f, c=gc()); 60 for(; c>47&&c<58; x = x*10 + c - 48, c=gc()); 61 return x*f; 62 } 63 64 typedef long long LL; 65 typedef unsigned long long uLL; 66 typedef pair< double, double > PDD; 67typedef pair < int , int > PII; 68 typedef pair < string , int > PSI; 69 typedef Set < int > SI; 70 typedef vector < int > VI; 71 typedef vector <PII> VPII; 72 typedef map < int , int > MII; 73 typedef pair <LL, LL> PLL; 74 typedef vector <LL> VL; 75 typedef vector <VL> VVL; 76 typedef priority_queue< int > PQIMax; 77 typedef priority_queue< int, VI, greater< int > > PQIMin; 78 const double EPS = 1e-10; 79 const LL inf = 0x7fffffff; 80 const LL infLL = 0x7fffffffffffffffLL; 81 const LL mod = 1e9 + 7; 82 const int maxN = 2e5 + 7; 83 const LL ONE = 1; 84 const LL evenBits = 0xaaaaaaaaaaaaaaaa; 85 const LL oddBits = 0x5555555555555555; 86 87 88 int Q; 89 PQIMax maxH; 90 PQIMin minH; 91 LL sumB, sumLA, sumRA, ans; 92 93 int main(){ 94 INIT(); 95 cin >> Q; 96 while(Q--) { 97 int x, a, b; 98 cin >> x; 99 if(x == 1) { 100 cin >> a >> b; 101 sumB += b; 102 if(maxH.size() == minH.size()) { 103 if(maxH.empty()) { 104 maxH.push(a); 105 sumLA += a; 106 } 107 else if(a >= maxH.top()) { 108 minH.push(a); 109 sumRA += a; 110 } 111 else { 112 maxH.push(a); 113 sumLA += a; 114 } 115 } 116 else if(maxH.size() > minH.size()) { 117 if(a >= maxH.top()) { 118 minH.push(a); 119 sumRA += a; 120 } 121 else { 122 maxH.push(a); 123 sumLA += a; 124 sumLA -= maxH.top(); 125 minH.push(maxH.top()); 126 sumRA += maxH.top(); 127 maxH.pop(); 128 } 129 } 130 else { 131 if(a < minH.top()) { 132 maxH.push(a); 133 sumLA += a; 134 } 135 else { 136 minH.push(a); 137 sumRA += a; 138 sumRA -= minH.top(); 139 maxH.push(minH.top()); 140 sumLA += minH.top(); 141 minH.pop(); 142 } 143 } 144 } 145 else { 146 int x = maxH.top(); 147 ans = sumRA - sumLA + sumB; 148 if(maxH.size() > minH.size()) ans += maxH.top(); 149 else if(maxH.size() < minH.size()) { 150 ans -= minH.top(); 151 x = minH.top(); 152 } 153 cout << x << " " << ans << endl; 154 } 155 } 156 return 0; 157 }