Submission #1369571

#TimeUsernameProblemLanguageResultExecution timeMemory
1369571pcheloveksTriangular Rainfall (JOI26_rainfall)C++20
24 / 100
227 ms58368 KiB
#define _CRT_SECURE_NO_WARNINGS
 
#include <bits/stdc++.h>
 
#define endl '\n'
 
//#pragma GCC optimize("Ofast")
 
using namespace std;
 
using ll = long long;
using ld = long double;
using pii = pair < int, int >;
using pll = pair < ll, ll >;
 
const ll INF = 2e18;
const ll DIM = 100007;
const ll DIMQ = 2007;
const ld PI = 3.1415926535;
const int mod = 998244353;

struct point {
    int x, y, z;
};

vector < pll > merge(vector < pll > v1, vector < pll > v2) {
    vector < pll > res = v1;
    for(auto x: v2) res.push_back(x);

    sort(res.begin(), res.end());

    vector < pll > tmp;
    for(int i = res.size() - 1; i >= 0 && tmp.size() < 5; i--) {
        if(tmp.size() == 0 || tmp.back() != res[i]) tmp.push_back(res[i]);
    }
    reverse(tmp.begin(), tmp.end());
    return tmp;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
#ifdef IloveCP
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif  

    int l, n, k;
    cin >> l >> n >> k;

    vector < ll > X, Y;
    map < pll, vector < pll > > Z;
    
    for(int i = 0; i < n; i++) {
        ll x, y, z;
        cin >> x >> y >> z;

        X.push_back(x);
        Y.push_back(y);

        Z[{x, y}].push_back({x + y + z, i});
    }

    sort(X.begin(), X.end());
    sort(Y.begin(), Y.end());

    X.erase(unique(X.begin(), X.end()), X.end());
    Y.erase(unique(Y.begin(), Y.end()), Y.end());

    vector < vector < vector < pll > > > s(X.size(), vector < vector < pll > >(Y.size()));

    vector < ll > res(6, 0);

    for(int i = 0; i < X.size(); i++) {
        for(int j = 0; j < Y.size(); j++) {
            if(Z[{X[i], Y[j]}].size() != 0) {
                s[i][j] = Z[{X[i], Y[j]}];
                sort(s[i][j].rbegin(), s[i][j].rend());
                while(s[i][j].size() > 5) s[i][j].pop_back();
                reverse(s[i][j].begin(), s[i][j].end());
            }
            if(i != 0) s[i][j] = merge(s[i][j], s[i - 1][j]);
            if(j != 0) s[i][j] = merge(s[i][j], s[i][j - 1]);



            for(int tk = 0; tk < s[i][j].size(); tk++) {
                ll cnt = max((ll)0, s[i][j][tk].first - (X[i] + Y[j]));
                ll dx, dy;
                if(i == X.size() - 1) dx = l + 1 - Y[j] - X[i];
                else dx = X[i + 1] - X[i];
                
                if(j == Y.size() - 1) dy = l + 1 - X[i] - Y[j];
                else dy = Y[j + 1] - Y[j];

                ll l1 = cnt - min(cnt, dy);
                ll l2 = cnt - min(cnt, dx);
                ll l3 = l2 - min(l2, dy);
                
                ll val = cnt * cnt - l1 * l1 - l2 * l2 + l3 * l3;

                //cout << s[i][j].size() - tk << " " << X[i] << " " << Y[j] << " " << val << endl;

                res[s[i][j].size() - tk] += val; 
            }
        }
    }

    for(int i = 1; i <= k; i++) {
        cout << res[i] << endl;
    }

    return 0;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...