結果
問題 | No.1079 まお |
ユーザー |
|
提出日時 | 2020-06-12 22:12:24 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,107 ms / 2,000 ms |
コード長 | 2,346 bytes |
コンパイル時間 | 3,391 ms |
コンパイル使用メモリ | 219,832 KB |
最終ジャッジ日時 | 2025-01-11 02:38:03 |
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 30 |
ソースコード
#include <bits/stdc++.h>using namespace std;int N, K;vector<int> A;int64_t ans = 0;struct UnionFind {vector<int> par;vector<int> sz;vector<bool> active;vector<map<int, int64_t>> cnt, sum;UnionFind(int n){par.resize(n);sz.assign(n, 1);active.assign(n, false);cnt.resize(n);sum.resize(n);for(int i=0; i<n; i++){par[i] = i;cnt[i][A[i]]++;sum[i][A[i]] += i;}}int find(int x){if(par[x] == x){return x;}else{return par[x] = find(par[x]);}}bool unite(int x, int y){x = find(x), y = find(y);if(x == y) return false;if(cnt[x].size() > cnt[y].size()) swap(x, y);par[x] = y;sz[y] += sz[x];for(auto& [k, v] : cnt[x]) cnt[y][k] += v;for(auto& [k, v] : sum[x]) sum[y][k] += v;return true;}void calc(int x, int y){x = find(x);y = find(y);if(cnt[x].size() > cnt[y].size()) swap(x, y);auto& cnt1 = cnt[x];auto& cnt2 = cnt[y];auto& sum1 = sum[x];auto& sum2 = sum[y];for(auto& [v1, n1] : cnt1){int64_t s1 = sum1[v1];int v2 = K-v1;if(!cnt2.count(v2)) continue;int64_t n2 = cnt2[v2], s2 = sum2[v2];int64_t res = abs(n1*s2 - n2*s1) + n1*n2;ans += res;}}bool same(int x, int y){ return find(x) == find(y); }int size(int x){ return sz[find(x)]; }};int main(){cin >> N >> K;A.resize(N);map<int, vector<int>> mpos;for(int i=0; i<N; i++){cin >> A[i];if(2*A[i] == K) ans++;mpos[-A[i]].push_back(i);}UnionFind uf(N);for(auto& [kk, v] : mpos){for(int i : v){bool lok = false, rok = false;if(i>0 && uf.active[i-1]) lok = true, uf.calc(i-1, i);if(i<N-1 && uf.active[i+1]) rok = true, uf.calc(i, i+1);if(lok && rok) uf.calc(i-1, i+1);}for(int i : v){uf.active[i] = true;if(i>0 && uf.active[i-1]) uf.unite(i-1, i);if(i<N-1 && uf.active[i+1]) uf.unite(i, i+1);}}cout << ans << endl;return 0;}