제출 #1042292

#제출 시각아이디문제언어결과실행 시간메모리
1042292c2zi6팀들 (IOI15_teams)C++14
0 / 100
66 ms32172 KiB
#define _USE_MATH_DEFINES
#include <bits/stdc++.h>
#define ff first
#define ss second
#define pb push_back
#define all(a) (a).begin(), (a).end()
#define replr(i, a, b) for (int i = int(a); i <= int(b); ++i)
#define reprl(i, a, b) for (int i = int(a); i >= int(b); --i)
#define rep(i, n) for (int i = 0; i < int(n); ++i)
#define mkp(a, b) make_pair(a, b)
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> PII;
typedef vector<int> VI;
typedef vector<PII> VPI;
typedef vector<VI> VVI;
typedef vector<VVI> VVVI;
typedef vector<VPI> VVPI;
typedef pair<ll, ll> PLL;
typedef vector<ll> VL;
typedef vector<PLL> VPL;
typedef vector<VL> VVL;
typedef vector<VVL> VVVL;
typedef vector<VPL> VVPL;
template<class T> T setmax(T& a, T b) {if (a < b) return a = b; return a;}
template<class T> T setmin(T& a, T b) {if (a < b) return a; return a = b;}
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
template<typename T>
using indset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
#include "teams.h"

/* PERSISTENT SEGMENT TREE FOR 2D SUM QUERIES */
struct PERSISTENTSEGTREE {
    static const int MININD = 0;
    static const int MAXIND = +1e9;
    VI val;
    VI lft, rgt;
    VI roots;
    VI layer;
    int addnode() {
        val.pb(0);
        lft.pb(0);
        rgt.pb(0);
        return val.size()-1;
    }
    PERSISTENTSEGTREE() {
        roots.pb(addnode());
        layer.pb(-1);
    }
    void upd(int PREV, int N, int L, int R, int i, int s) {
        if (L == R) {
            if (PREV == -1) val[N] = s;
            else val[N] = val[PREV] + s;
            return;
        }
        int M = (L + R) / 2;
        if (i <= M) {
            if (!lft[N]) lft[N] = addnode();
            upd(lft[PREV], lft[N], L, M, i, s);
            rgt[N] = rgt[PREV];
        } else {
            if (!rgt[N]) rgt[N] = addnode();
            upd(rgt[PREV], rgt[N], M+1, R, i, s);
            lft[N] = lft[PREV];
        }
        val[N] = val[lft[N]] + val[rgt[N]];
    }
    void upd(int time, int ind, int s = +1) {
        roots.pb(addnode());
        layer.pb(time);
        upd(roots[roots.size()-2], roots[roots.size()-1], MININD, MAXIND, ind, s);
    }
    int get(int N, int L, int R, int l, int r) {
        if (l <= L && R <= r) return val[N];
        if (R < l || L > r) return 0;
        int M = (L + R) / 2;
        int sum = 0;
        if (lft[N]) sum += get(lft[N], L, M, l, r);
        if (rgt[N]) sum += get(rgt[N], M+1, R, l, r);
        return sum;
    }
    int get(int time, int l, int r) {
        return get(roots[upper_bound(all(layer), time) - layer.begin()-1], MININD, MAXIND, l, r);
    }
};
struct PURS {
    PERSISTENTSEGTREE seg;
    PURS(){}
    PURS(VPI a) {
        sort(all(a));
        for (auto[x, y] : a) seg.upd(y, x);
    }
    int get(int minx, int maxx, int miny, int maxy) {
        /*cout << minx << " <= x <= " << maxx << endl;*/
        /*cout << miny << " <= y <= " << maxy << endl;*/
        int ret;
        if (maxy < miny) ret = 0;
        else ret = seg.get(maxx, miny, maxy) - seg.get(minx-1, miny, maxy);
        /*cout << ret << endl;*/
        return ret;
    }
};

int n;
VPI ranges;
PURS table;

void init(int N, int A[], int B[]) {
    n = N;
    ranges = VPI(n);
    rep(i, n) ranges[i] = {A[i], B[i]};
    table = PURS(ranges);
}

int can(int M, int K[]) {
    int m = M;
    VI a(m);
    rep(i, m) a[i] = K[i];
    sort(all(a));
    if (true) {
        VI dp(m);

        /*rep(i, m) {*/
        /*    cout << "POINT " << i << endl;*/
        /*    cout << table.get(a[i], +1e9, 0, a[i]) << endl << endl;*/
        /*}*/

        rep(i, m) {
            /*cout << "PROCESSING " << i << endl;*/
            dp[i] = table.get(a[i], +1e9, 0, a[i]) - a[i];
            rep(j, i) {
                /*cout << "PROCESSING " << i << " USING " << j << endl;*/
                setmin(dp[i], dp[j] + table.get(a[i], +1e9, a[j]+1, a[i]) - a[i]);
            }
        }
        /*rep(i, m) cout << dp[i] << " "; cout << endl;*/
        int mn = 2e9;
        for (int x : dp) setmin(mn, x);
        return mn >= 0;
    }
    return -1;
}








컴파일 시 표준 에러 (stderr) 메시지

teams.cpp: In member function 'int PERSISTENTSEGTREE::addnode()':
teams.cpp:46:26: warning: conversion from 'std::vector<int>::size_type' {aka 'long unsigned int'} to 'int' may change value [-Wconversion]
   46 |         return val.size()-1;
      |                ~~~~~~~~~~^~
teams.cpp: In constructor 'PURS::PURS(VPI)':
teams.cpp:93:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   93 |         for (auto[x, y] : a) seg.upd(y, x);
      |                  ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...