Submission #1018092

#TimeUsernameProblemLanguageResultExecution timeMemory
1018092khanhphucscratchAliens (IOI16_aliens)C++14
100 / 100
253 ms35704 KiB
#include<bits/stdc++.h>
#include "aliens.h"
#define int long long
using namespace std;
struct CHT
{
    vector<pair<int, int>> line;
    vector<int> info;
    vector<double> hull;
    double intersection(pair<int, int> x, pair<int, int> y)
    {
        return (double)(x.second - y.second) / (y.first - x.first);
    }
    void addline(pair<int, int> x, int inf)
    {
        while(hull.size() > 0 && intersection(x, line[line.size()-1]) <= hull[hull.size()-1]){
            hull.pop_back(); line.pop_back(); info.pop_back();
        }
        if(line.size() > 0) hull.push_back(intersection(line[line.size()-1], x));
        line.push_back(x);
        info.push_back(inf);
    }
    pair<int, int> bestval(int x)
    {
        if(line.size() == 0) return make_pair(1e15, 0);
        if(line.size() == 1) return make_pair(line[0].first*x+line[0].second, info[0]);
        int place = upper_bound(hull.begin(), hull.end(), x) - hull.begin();
        //cout<<line.size()<<" "<<info.size()<<" "<<place<<" "<<info[1]<<endl;
        if(place > 0 && line[place].first*x+line[place].second == line[place-1].first*x+line[place-1].second) return make_pair(line[place].first*x+line[place].second, min(info[place], info[place-1]));
        else return make_pair(line[place].first*x+line[place].second, info[place]);
    }
};
int dp[1000005], cnt[1000005], last[1000005];
inline bool cmp(pair<int, int> x, pair<int, int> y)
{
    return x.second < y.second || (x.second == y.second && x.first > y.first);
}
int take_photos(int32_t n, int32_t m, int32_t k, vector<int32_t> r, vector<int32_t> c)
{
    //Transform to segments
    vector<pair<int, int>> segment;
    for(int i = 0; i < n; i++){
        if(r[i] <= c[i]) segment.push_back({r[i], c[i]+1});
        else segment.push_back({c[i], r[i]+1});
    }
    //Eliminate unnecessary segments
    sort(segment.begin(), segment.end(), cmp);
    vector<pair<int, int>> sus;
    for(pair<int, int> i : segment){
        while(sus.size() > 0 && sus[sus.size()-1].first >= i.first){
            sus.pop_back();
        }
        sus.push_back(i);
    }
    memset(last, -1, sizeof(last));
    for(pair<int, int> i : sus){
        last[i.second] = i.first;
        //cout<<i.first<<" "<<i.second<<endl;
    }
    //O(m log n log eps^-1) dp
    int le = 0, ri = 1e12, ans = 1e18, lamdaval;
    while(le <= ri){
        int lambd = (le+ri)/2;
        int lastplace = -1;
        CHT st;
        st.addline({0, 0}, 0);
        for(int i = 1; i <= m; i++){
            if(last[i] > -1){
                pair<int, int> newline;
                newline = make_pair(-2*last[i], last[i]*last[i]);
                if(last[i] < lastplace) newline.second -= (lastplace - last[i]) * (lastplace - last[i]);
                if(lastplace > -1) newline.second += dp[lastplace];
                st.addline(newline, cnt[lastplace]);
            }
            if(last[i] == -1){
                dp[i] = dp[i-1]; cnt[i] = cnt[i-1];
            }
            else{
                pair<int, int> sus = st.bestval(i);
                dp[i] = i*i + sus.first + lambd;
                cnt[i] = sus.second+1;
                lastplace = i;
            }
            //cout<<"A"<<i<<" "<<dp[i]<<" "<<cnt[i]<<endl;
        }
        if(cnt[m] <= k){
            ri = lambd-1;
            ans = dp[m];
            lamdaval = lambd;
    //cout<<lamdaval<<" "<<ans<<" "<<cnt[m]<<endl;
        }
        else{
            le = lambd+1;
        }
        //cout<<lambd<<" "<<cnt[m]<<endl;
        //return 0;
    }
    return ans - k*lamdaval;
}
/*signed main()
{
    cout<<take_photos(5, 6, 4, {0, 1, 2, 3, 4}, {1, 2, 3, 4, 5});
}*/

Compilation message (stderr)

aliens.cpp: In function 'long long int take_photos(int32_t, int32_t, int32_t, std::vector<int>, std::vector<int>)':
aliens.cpp:98:19: warning: 'lamdaval' may be used uninitialized in this function [-Wmaybe-uninitialized]
   98 |     return ans - k*lamdaval;
      |                  ~^~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...