제출 #1122561

#제출 시각아이디문제언어결과실행 시간메모리
1122561nhinccFancy Fence (CEOI20_fancyfence)C++20
100 / 100
34 ms3144 KiB
/// Author : Nguyễn Thái Sơn - K18 - KHMT - UIT
/// Training ICPC 2024

#include<bits/stdc++.h>

/// #pragma GCC optimize("O3,unroll-loops")
/// #pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

#define fi first
#define se second
#define TASK "test"
#define pb push_back
#define EL cout << endl
#define Ti20_ntson int main()
#define in(x) cout << x << endl
#define all(x) (x).begin(),(x).end()
#define getbit(x, i) (((x) >> (i)) & 1)
#define cntbit(x) __builtin_popcount(x)
#define FOR(i,l,r) for (int i = l; i <= r; i++)
#define FORD(i,l,r) for (int i = l; i >= r; i--)
#define Debug(a,n) for (int i = 1; i <= n; i++) cout << a[i] << " "; cout << endl

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> vii;
typedef unsigned long long ull;
typedef vector<vector<int>> vvi;
int fastMax(int x, int y) { return (((y-x)>>(32-1))&(x^y))^y; }

const int N = 1e5 + 5;
const int oo = INT_MAX;
const int mod = 1e9 + 7;
const int d4x[4] = {-1, 0, 1, 0} , d4y[4] = {0, 1, 0, -1};
const int d8x[8] = {-1, -1, 0, 1, 1, 1, 0, -1}, d8y[8] = {0, 1, 1, 1, 0, -1, -1, -1};

int n, Ans = 0;
pair<int, int> r[N];
tuple<int, int, int> a[N];

void Add(int &u, int v) {
    u += v;
    if (u >= mod) u -= mod;
}

void Del(int &u, int v) {
    u -= v;
    if (u < 0) u += mod;
}

long long Cost(long long x) {
    x %= mod;
    return (((x - 1) * x) / 2) % mod;
}

long long numRect(long long w, long long h) {
    return Cost(w + 1) * Cost(h + 1) % mod;
}

inline void Read_Input() {
    cin >> n;
    FOR(i, 1, n)
        cin >> r[i].fi;
    FOR(i, 1, n)
        cin >> r[i].se;

    FOR(i, 1, n)
        a[i] = {r[i].fi, r[i].se, i};
}

struct dsu {

    vector<long long> par;

    void sz(int n) {
        par.resize(n + 5);
        FOR(i, 1, n)
            par[i] = -r[i].se;
    }

    int Find(int u) {
        if (par[u] < 0) return u;
        par[u] = Find(par[u]);
        return par[u];
    }

    void Merge(int x, int y, int h) {
        x = Find(x);
        y = Find(y);
        if (x == y) return;

        Add(Ans, numRect(-par[x] - par[y], h));
        Del(Ans, numRect(-par[x], h));
        Del(Ans, numRect(-par[y], h));

        if (par[x] > par[y])
            swap(x, y);
        par[x] += par[y];
        par[y] = x;
    }

}DSU;

inline void Solve() {
    vector<bool> is_used(n + 5, 0);
    sort(a + 1, a + n + 1);
    DSU.sz(n);
    FORD(i, n, 1) {
        auto[h, w, id] = a[i];
        Add(Ans, numRect(w, h));
        if (is_used[id + 1])
            DSU.Merge(id, id + 1, h);

        if (is_used[id - 1])
            DSU.Merge(id, id - 1, h);

        is_used[id] = true;
    }

    cout << Ans;
}

Ti20_ntson {
//    freopen(TASK".INP","r",stdin);
//    freopen(TASK".OUT","w",stdout);
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    int T = 1;
//    cin >> T;
    while (T -- ) {
        Read_Input();
        Solve();
    }
}


#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...
#Verdict Execution timeMemoryGrader output
Fetching results...