Submission #130560

#TimeUsernameProblemLanguageResultExecution timeMemory
130560KieranHorganAliens (IOI16_aliens)C++17
60 / 100
2084 ms705000 KiB
    #pragma GCC optimize("O3")
    #include "aliens.h"
        #include <bits/stdc++.h>
        using namespace std;
         
        #define int long long
         
        vector<pair<int, int>> intervals;
        int cost(int i, int l) {
        	int overlap = max(0ll, intervals[l].second-intervals[l+1].first+1);
        	return (intervals[i].second-intervals[l+1].first+1)*(intervals[i].second-intervals[l+1].first+1) - overlap*overlap;
        }
        signed n;
        vector<vector<int>> dp, opt;
        int j;
        void recurse(int l, int r) {
        	if(l==r) return;
        	int i = (l+r)/2;
        	for(int cur = opt[j][l-1]; cur < (r==n+1?i:opt[j][r]+1); cur++) {
        		if(dp[j-1][cur] + cost(i, cur) < dp[j][i]) {
        			opt[j][i] = cur;
        			dp[j][i] = dp[j-1][cur] + cost(i, cur);
        		}
        	}
        	if(l+1 != r) {
        		recurse(l, i);
        		recurse(i+1, r);
        	}
        }
         
        long long take_photos(signed N, signed m, signed k, vector<signed> r, vector<signed> c) {
        	n=N;
        	for(int i = 0; i < n; i++) {
        		if(c[i] >= r[i])
        			intervals.push_back({r[i], -c[i]});
        		else
        			intervals.push_back({c[i], -r[i]});
        	}
        	sort(intervals.begin(), intervals.end());
         
        	auto interStore = intervals;
        	intervals.clear();
        	intervals.push_back({-1, -1});
        	int ma = -1;
        	for(auto p: interStore) {
        		if(-p.second > ma) {
        			ma = -p.second;
        			intervals.push_back({p.first, -p.second});
        		}
        	}
         
         
        	n = intervals.size()-1;
        	k = min(k, n);
         
        	dp.assign(k+1, vector<int>(n+1, 1ll<<60));
        	opt.assign(k+1, vector<int>(n+1, 0));
        	dp[0][0] = 0;
         
        	// queue<pair<int, int>> ranges;
        	for(j = 1; j <= k; j++) {
        		recurse(1ll, (int)n+1);
        	}
         
            return dp[k][n];
        }
#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...