Submission #1255725

#TimeUsernameProblemLanguageResultExecution timeMemory
1255725allin27xAliens (IOI16_aliens)C++20
25 / 100
2093 ms94788 KiB
#include "aliens.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define _min(x,y) x = min(x,y)

const int INF = 1e18;
const int N = 1e5+4;
vector<vector<int>> dp;
int sm[N];


struct line {
	int a=0,b=0;
	int f(int x) {
		return a*x + b;
	}
};

struct Node {
	line sup;
	Node *lnode = nullptr;
	Node *rnode = nullptr;
	int l, r;
	void extend() {
		if (lnode) return;
		if (l == r) return;
		lnode = new Node(); rnode = new Node();
		int m = (l+r)/2;
		lnode->sup = sup; rnode -> sup = sup;
		lnode -> l = l; lnode -> r = m;
		rnode -> l = m+1; rnode -> r = r;
	}
	void add(line nw) {
		extend();
		int m = (l+r)/2;
		int c1 = nw.f(m) <= sup.f(m); int c2 = nw.f(l) <= sup.f(l);
		if (c1) swap(sup, nw);
		if (l == r) return;
		if (c1^c2) lnode->add(nw); else rnode->add(nw);
	}
	int ans(int pt) {
		extend();
		int m = (l+r)/2;
		if (l == r) return sup.f(pt);
		if (pt <= m) return min(sup.f(pt), lnode->ans(pt));
		else return min(sup.f(pt), rnode->ans(pt));
	}
};


long long take_photos(signed n, signed m, signed k, std::vector<signed> rw, std::vector<signed> cl) {
    dp.assign(n+3, vector<int> (k+3, INF));
    vector<array<int,3>> rgs(n);
    for (int i=0; i<n; i++){
        int l = min(rw[i], cl[i]) + 1; int r = max(rw[i], cl[i]) + 1;
        rgs[i] = {l, r, 0};
    }
    sort(rgs.begin(), rgs.end());
    int lastr = -1; vector<array<int,3>> nrgs = {{0,0,0}};
    for (int i=0; i<n; i++){
        int l = rgs[i][0]; int r = rgs[i][1];
        if (r <= lastr) continue;
        int area = (r-l+1)*(r-l+1);
        if (l <= lastr) area -= (lastr-l+1)*(lastr-l+1);
        lastr = r;
        nrgs.push_back({l, r, area});
    }
    rgs = nrgs;       
    int totarea = 0;
    for (int i=rgs.size()-1; i>=0; i--){
        int area = rgs[i][1] - rgs[i][0] + 1; area *= area;
        sm[i] = totarea + area;
        totarea += rgs[i][2];
    }
   
    for (int i=0; i<k+3; i++) dp[0][i] = 0;
    for (int i=1; i<rgs.size(); i++){
        for (int nr = 1; nr <= k; nr++){
            for (int lf = i; lf; lf--){
                line v;
                v.b += dp[lf-1][nr-1];
                v.b += (rgs[lf][0] - 1) * (rgs[lf][0] - 1);
                v.b -= sm[lf];
                v.a += 2 * (1 - rgs[lf][0]);
                int area = rgs[i][1] - rgs[i][0] + 1; area *= area;
                _min(dp[i][nr], v.f(rgs[i][1]) + rgs[i][1] * rgs[i][1] + sm[i] - area);
                totarea += rgs[lf][2];
            }
        }
        for (int nr = 1; nr<=k; nr++) _min(dp[i][nr], dp[i][nr-1]);
    }
    return sm[1] + dp[rgs.size()-1][k];
}

Compilation message (stderr)

aliens.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
aliens_c.h:1:9: warning: #pragma once in main file
    1 | #pragma once
      |         ^~~~
#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...