Submission #498474

#TimeUsernameProblemLanguageResultExecution timeMemory
498474YuisuyunoPalembang Bridges (APIO15_bridge)C++14
100 / 100
216 ms14360 KiB
//Nguyen Huu Hoang Minh
#include <bits/stdc++.h>
#define sz(x) int(x.size())
#define all(x) x.begin(),x.end()
#define reset(x) memset(x, 0,sizeof(x))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define N 100005
#define remain(x) if (x > MOD) x -= MOD
#define ii pair<int, int>
#define iiii pair< ii , ii >
#define viiii vector< iiii >
#define vi vector<int>
#define vii vector< ii >
#define bit(x, i) (((x) >> (i)) & 1)
#define Task "test"
#define int long long

using namespace std;

typedef long double ld;
const int inf = 1e10;
const int minf = -1e10;

int n, k;
struct ppl{
    int s, t;
    bool operator < (const ppl &a) const{
        return s+t < a.s + a.t;
    }
};
vector<ppl> Q;
int same_side = 0;
int pref[N];
multiset<int> low, high;
int sumr, suml;

void add(int x){
    int med = (low.size() ? *low.rbegin() : 1e15);
    if (x <= med){
        low.insert(x); suml+=x;
    }
    else high.insert(x), sumr+=x;
    if (low.size() > high.size()+1){
        int tmp = *low.rbegin();
        suml -= tmp;
        high.insert(tmp);
        sumr += tmp;
        low.erase(low.find(tmp));
    }
    else if (low.size() < high.size()){
        int tmp = *high.begin();
        sumr -= tmp;
        suml += tmp;
        low.insert(tmp);
        high.erase(high.find(tmp));
    }
}

void readfile()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    if (fopen(Task".inp","r"))
    {
        freopen(Task".inp","r",stdin);
        //freopen(Task".out","w",stdout);
    }
    cin >> k >> n;
    for(int i=1; i<=n; i++){
        char a, b;
        int x, y;
        cin >> a >> x >> b >> y;
        if (a==b) same_side += abs(x-y);
        else{
            Q.pb({x,y});
        }
    }
    sort(all(Q));
}

void proc()
{
    n = Q.size();
    same_side += n;
    for(int i=0; i<Q.size(); i++){
        add(Q[i].s);
        add(Q[i].t);
        pref[i] = sumr - suml;
    }
    int ans = pref[n-1];
    if (k==2){
        suml = 0; sumr = 0; low.clear(); high.clear();
        for(int i=n-1; i>=0; i--){
            add(Q[i].s);
            add(Q[i].t);
            ans = min(ans,sumr - suml + pref[i-1]);
        }
    }
    cout << same_side + ans;
}

signed main()
{
    readfile();
    proc();
    return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'void proc()':
bridge.cpp:88:19: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<ppl>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   88 |     for(int i=0; i<Q.size(); i++){
      |                  ~^~~~~~~~~
bridge.cpp: In function 'void readfile()':
bridge.cpp:68:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |         freopen(Task".inp","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...