AtCoder ABC 127F Absolute Minima

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.
  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 }
View Code

 

Guess you like

Origin www.cnblogs.com/zaq19970105/p/10941714.html