답안 #145381

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
145381 2019-08-19T18:33:43 Z jacynkaa Rectangles (IOI19_rect) C++14
컴파일 오류
0 ms 0 KB
#include <bits/stdc++.h>
#include <math.h>
#include <chrono>
using namespace std;
#pragma GCC optimize("-O3")
#define endl "\n"
#define mp make_pair
#define st first
#define nd second
#define pii pair<int, int>
#define pb push_back
#define _upgrade ios_base::sync_with_stdio(0), cout.setf(ios::fixed), cout.precision(10) //cin.tie(0); cout.tie(0);
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define FWD(i, a, b) for (int i = (a); i < (b); ++i)
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define fwd(i, a, b) for (int i = (a); i < (b); ++i)
#define all(c) (c).begin(), (c).end()
#define what(x) cerr << #x << " is " << x << endl;
#define int long long

const int MAXN = 2505; //UWAGA

vector<int> prawo[MAXN][MAXN];
vector<int> dol[MAXN][MAXN];
vector<pii> R[MAXN][MAXN];
vector<pii> D[MAXN][MAXN];
int n, m;
int tab[MAXN][MAXN];
long long ans = 0;

vector<pair<pii, pii>> odp;

void wypisz()
{
    sort(all(odp));
    for (auto a : odp)
    {
        cerr << a.st.st << " " << a.st.nd << " " << a.nd.st << " " << a.nd.nd << endl;
    }
}

void wypelnij2prawo()
{
    rep(j, m)
    {
        vector<pii> X(3e3, {-1, -1});
        for (int i = n - 1; i >= 0; i--)
            for (int a : prawo[i][j])
            {
                X[a] = (X[a].st == i + 1) ? mp(i, X[a].nd + 1) : mp(i, 1ll);
                R[i][j].pb({a, X[a].nd}); //glebokosc i ile
            }
    }
}

void wypelnij2dol()
{
    rep(i, n)
    {
        vector<pii> X(3e3, {-1, -1});
        for (int j = m - 1; j >= 0; j--)
            for (int a : dol[i][j])
            {
                X[a] = (X[a].st == j + 1) ? mp(j, X[a].nd + 1) : mp(j, 1ll);
                D[i][j].pb({a, X[a].nd}); //glebokosc i ile
            }
    }
}

vector<vector<int>> wypelnij1(vector<int> &Q)
{
    vector<pii> X;
    rep(j, Q.size())
        X.pb({Q[j], j});
    vector<vector<int>> P(Q.size());
    sort(all(X));
    reverse(all(X));
    set<pii> S;
    int j = 0;
    while (j < Q.size())
    {
        int k = j;

        while (k + 1 < m && X[j].st == X[k + 1].st)
            k++;
        for (int l = j; l <= k; l++)
        {
            // cerr << X[l].nd << " " << X[l].st << endl;
            S.insert({X[l].nd, X[l].st});
        }
        for (int l = j; l <= k; l++)
        {
            auto r = S.find({X[l].nd, X[l].st});
            auto q = (r == S.begin()) ? r : next(r, -1);
            auto s = (next(r, 1) == S.end()) ? r : next(r, 1);

            //   cerr << q->st << " " << r->st << " " << s->st << endl;

            if (r->st - q->st - 1 > 0) //popraawic!!!!
            {
                P[q->st].pb(r->st - q->st - 1);
                //cerr << q->st << " ech1 " << r->st << endl;
            }

            if (s->st - r->st - 1 > 0 && s->nd != r->nd)
            {
                P[r->st].pb(s->st - r->st - 1);
                //cerr << s->st << " ech2 " << r->st << endl;
            }
        }
        j = k + 1;
    }
    return P;
}

void solve(int i, int j)
{

    for (auto A : D[i][j + 1])
        for (auto B : R[i + 1][j])
        {

            if (B.nd >= A.st && A.nd >= B.st)
            {
                //odp.pb(mp(mp(i + 1, j + 1), mp(i + A.st, j + B.st)));
                // cout << "tuutaj:" << i << " " << j << endl;
                ans++;
            }
        }
}

long long count_rectangles(vector<vector<int>> A)
{
    n = A.size();
    m = A[0].size();
    rep(i, n) rep(j, m) tab[i][j] = A[i][j];
    rep(i, n)
    {
        auto X = wypelnij1(A[i]);
        rep(j, m)
            prawo[i][j] = X[j];
    }
    rep(j, m)
    {
        vector<int> Y;
        rep(i, n)
            Y.pb(tab[i][j]);
        auto X = wypelnij1(Y);
        rep(i, n)
            dol[i][j] = X[i];
    }
    wypelnij2prawo();
    wypelnij2dol();
    /* 
    cerr << "DOL" << endl;
    rep(i, n)
    {
        rep(j, m)
        {
            cerr << i << " " << j << "::  ";
            for (auto a : D[i][j])
                cerr << a.st << " " << a.nd << ", ";
            cerr << endl;
            // cout << a << "              /// ";
        }
        cerr << endl;
    }
    cerr << "PRAWO" << endl;
    rep(i, n)
    {
        rep(j, m)
        {
            cerr << i << " " << j << "::  ";
            for (auto a : R[i][j])
                cerr << a.st << " " << a.nd << ", ";
            // cout << a << "              /// ";
            cerr << endl;
        }
        cerr << endl;
    }
    */
    rep(i, n - 1) rep(j, m - 1) solve(i, j);
    return ans;
}
/*
main()
{
    _upgrade;
    string S;
    cin >> S;
    int a, b;
    cin >> a >> b;
    vector<vector<int>> X(a, vector<int>(b));
    rep(i, a) rep(j, b) cin >> X[i][j];
    cout << count_rectangles(X)
         << endl;
    // wypisz();
}
*/

Compilation message

rect.cpp: In function 'std::vector<std::vector<long long int> > wypelnij1(std::vector<long long int>&)':
rect.cpp:15:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep(i, n) for (int i = 0; i < (n); ++i)
                                     ^
rect.cpp:73:5: note: in expansion of macro 'rep'
     rep(j, Q.size())
     ^~~
rect.cpp:80:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     while (j < Q.size())
            ~~^~~~~~~~~~
/tmp/cc74iHVh.o: In function `main':
grader.cpp:(.text.startup+0x89e): undefined reference to `count_rectangles(std::vector<std::vector<int, std::allocator<int> >, std::allocator<std::vector<int, std::allocator<int> > > >)'
collect2: error: ld returned 1 exit status