Submission #1255759

#TimeUsernameProblemLanguageResultExecution timeMemory
1255759allin27xAliens (IOI16_aliens)C++20
Compilation error
0 ms0 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;
int dp[N][2];
int sm[N];

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

const int M = 1e6+4;
line T[4*M];

void add(int l, int r, int p, line &nw) {
    int m = (l+r)/2;
    int c1 = nw.f(m) <= T[p].f(m); int c2 = nw.f(l) <= T[p].f(l);
    if (c1) swap(T[p], nw);
    if (l == r) return;
    if (c1^c2) add(l, m, 2*p+1, nw); else add(m+1, r, 2*p+2, nw);
}

int ans(int l, int r, int p, int pt) {
    int m = (l+r)/2;
    if (l == r) return T[p].f(pt);
    if (pt <= m) return min(T[p].f(pt), ans(l, m, 2*p+1, pt));
    else return min(T[p].f(pt), ans(m+1, r, 2*p+2, pt));
}


long long take_photos(signed n, signed m, signed k, std::vector<signed> rw, std::vector<signed> cl) {
    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<N; i++) for (int j=0; j<2; j++) dp[i][j] = INF;
    dp[0][0] = 0; dp[0][1] = 0;

    line ini; ini.a = 0; ini.b = INF; for (int i=0; i<4*M; i++) T[i] = ini;

    line v;

    while (k--) {
        for (int i=1; i<rgs.size(); i++){
            // add new ln
            v.b = 0; v.a = 0;
            v.b += dp[i-1][0];
            v.b += (rgs[i][0] - 1) * (rgs[i][0] - 1);
            v.b -= sm[i];
            v.a += 2 * (1 - rgs[i][0]);
            add(0, M-1, 1, v);
            
            //update ans

            int area = rgs[i][1] - rgs[i][0] + 1; area *= area;
            _min(dp[i][1], ans(0, M-1, 1, rgs[i][1]) + rgs[i][1] * rgs[i][1] + sm[i] - area);
            _min(dp[i][1], dp[i][0]);
        }
        for (int i=0; i<N; i++) dp[i][0] = dp[i][1];
        for (int i=0; i<N; i++) dp[i][1] = INF;
    }
    return sm[1] + dp[rgs.size()-1][0];
}
#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;
int dp[N][2];
int sm[N];

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

const int M = 1e6+4;
line T[4*M];

void add(int l, int r, int p, line &nw) {
    int m = (l+r)/2;
    int c1 = nw.f(m) <= T[p].f(m); int c2 = nw.f(l) <= T[p].f(l);
    if (c1) swap(T[p], nw);
    if (l == r) return;
    if (c1^c2) add(l, m, 2*p+1, nw); else add(m+1, r, 2*p+2, nw);
}

int ans(int l, int r, int p, int pt) {
    int m = (l+r)/2;
    if (l == r) return T[p].f(pt);
    if (pt <= m) return min(T[p].f(pt), ans(l, m, 2*p+1, pt));
    else return min(T[p].f(pt), ans(m+1, r, 2*p+2, pt));
}


long long take_photos(signed n, signed m, signed k, std::vector<signed> rw, std::vector<signed> cl) {
    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<N; i++) for (int j=0; j<2; j++) dp[i][j] = INF;
    dp[0][0] = 0; dp[0][1] = 0;

    line ini; ini.a = 0; ini.b = INF; for (int i=0; i<4*M; i++) T[i] = ini;

    line v;

    while (k--) {
        for (int i=1; i<rgs.size(); i++){
            // add new ln
            v.b = 0; v.a = 0;
            v.b += dp[i-1][0];
            v.b += (rgs[i][0] - 1) * (rgs[i][0] - 1);
            v.b -= sm[i];
            v.a += 2 * (1 - rgs[i][0]);
            add(0, M-1, 1, v);
            
            //update ans

            int area = rgs[i][1] - rgs[i][0] + 1; area *= area;
            _min(dp[i][1], ans(0, M-1, 1, rgs[i][1]) + rgs[i][1] * rgs[i][1] + sm[i] - area);
            _min(dp[i][1], dp[i][0]);
        }
        for (int i=0; i<N; i++) dp[i][0] = dp[i][1];
        for (int i=0; i<N; i++) dp[i][1] = INF;
    }
    return sm[1] + dp[rgs.size()-1][0];
}

Compilation message (stderr)

aliens.cpp:96:11: error: redefinition of 'const long long int INF'
   96 | const int INF = 1e18;
      |           ^~~
aliens.cpp:7:11: note: 'const long long int INF' previously defined here
    7 | const int INF = 1e18;
      |           ^~~
aliens.cpp:97:11: error: redefinition of 'const long long int N'
   97 | const int N = 1e5+4;
      |           ^
aliens.cpp:8:11: note: 'const long long int N' previously defined here
    8 | const int N = 1e5+4;
      |           ^
aliens.cpp:98:5: error: redefinition of 'long long int dp [100004][2]'
   98 | int dp[N][2];
      |     ^~
aliens.cpp:9:5: note: 'long long int dp [100004][2]' previously declared here
    9 | int dp[N][2];
      |     ^~
aliens.cpp:99:5: error: redefinition of 'long long int sm [100004]'
   99 | int sm[N];
      |     ^~
aliens.cpp:10:5: note: 'long long int sm [100004]' previously declared here
   10 | int sm[N];
      |     ^~
aliens.cpp:101:8: error: redefinition of 'struct line'
  101 | struct line {
      |        ^~~~
aliens.cpp:12:8: note: previous definition of 'struct line'
   12 | struct line {
      |        ^~~~
aliens.cpp:108:11: error: redefinition of 'const long long int M'
  108 | const int M = 1e6+4;
      |           ^
aliens.cpp:19:11: note: 'const long long int M' previously defined here
   19 | const int M = 1e6+4;
      |           ^
aliens.cpp:109:6: error: redefinition of 'line T [4000016]'
  109 | line T[4*M];
      |      ^
aliens.cpp:20:6: note: 'line T [4000016]' previously defined here
   20 | line T[4*M];
      |      ^
aliens.cpp:111:6: error: redefinition of 'void add(long long int, long long int, long long int, line&)'
  111 | void add(int l, int r, int p, line &nw) {
      |      ^~~
aliens.cpp:22:6: note: 'void add(long long int, long long int, long long int, line&)' previously defined here
   22 | void add(int l, int r, int p, line &nw) {
      |      ^~~
aliens.cpp:119:5: error: redefinition of 'long long int ans(long long int, long long int, long long int, long long int)'
  119 | int ans(int l, int r, int p, int pt) {
      |     ^~~
aliens.cpp:30:5: note: 'long long int ans(long long int, long long int, long long int, long long int)' previously defined here
   30 | int ans(int l, int r, int p, int pt) {
      |     ^~~
aliens.cpp:127:11: error: redefinition of 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)'
  127 | long long take_photos(signed n, signed m, signed k, std::vector<signed> rw, std::vector<signed> cl) {
      |           ^~~~~~~~~~~
aliens.cpp:38:11: note: 'long long int take_photos(int, int, int, std::vector<int>, std::vector<int>)' previously defined here
   38 | long long take_photos(signed n, signed m, signed k, std::vector<signed> rw, std::vector<signed> cl) {
      |           ^~~~~~~~~~~
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
      |         ^~~~