제출 #893339

#제출 시각아이디문제언어결과실행 시간메모리
893339vjudge1Izbori (COCI22_izbori)C++17
40 / 110
3064 ms9280 KiB
#include <iostream> #include <fstream> #include <iomanip> #include <vector> #include <set> #include <map> #include <cstring> #include <string> #include <cmath> #include <cassert> #include <ctime> #include <algorithm> #include <sstream> #include <list> #include <queue> #include <deque> #include <stack> #include <cstdlib> #include <cstdio> #include <iterator> #include <functional> #include <unordered_set> #include <unordered_map> #include <stdio.h> #include <bitset> #include <cstdint> #include <cassert> #include <functional> #include <complex> #include <climits> #include <random> using namespace std; #define ll long long #define pb push_back #define ull unsigned long long #define F first #define S second #define all(v) v.begin(), v.end() int n; int a[200005]; struct segTree{ int t[400010 * 4]; void upd(int idx, int v = 1, int l = 0, int r = 2 * n){ if(l == r){ t[v]++; return; } int m = (l + r) / 2; if(idx <= m) upd(idx, v * 2, l, m); else upd(idx, v * 2 + 1, m + 1, r); t[v] = t[v * 2] + t[v * 2 + 1]; } int get(int l, int r, int v = 1, int tl = 0, int tr = 2 * n){ if(tr < l || r < tl) return 0; if(l <= tl && tr <= r) return t[v]; int m = (tl + tr) / 2; return get(l, r, v * 2, tl, m) + get(l, r, v * 2 + 1, m + 1, tr); } } ver[2]; void sub3(){ int pref[2][n + 1]; for(int i = 0; i < 2; i++){ for(int j = 1; j <= n; j++) pref[i][j] = 0; } for(int i = 1; i <= n; i++){ if(a[i] == 2) a[i] = 1; else a[i] = 0; } for(int i = 1; i <= n; i++){ pref[0][i] = pref[0][i - 1] + (a[i] == 0 ? 1 : -1); pref[1][i] = pref[1][i - 1] + (a[i] == 1 ? 1 : -1); } ll ans = 0; for(int i = 0; i < 2; i++){ ver[i].upd(0 + n); for(int j = 1; j <= n; j++){ int x = pref[i][j]; //cout << x << "\n"; //cout << x + n << " " << x - 1 + n << "\n"; ver[i].upd(x + n); ans += ver[i].get(0, x - 1 + n); //cout << j << " " << ans << "\n"; } } cout << ans; } void sub12(){ ll ans = 0; for(int l = 1; l <= n; l++){ ans += 1; bool f = 1; int sz = 1, d = a[l]; map<int, int> cnt; ++cnt[d]; for(int r = l + 1; r <= n; r++){ ++cnt[a[r]]; if(a[r] == d) sz++; else if(cnt[a[r]] > sz) sz = cnt[a[r]], d = a[r]; if(sz > (r - l + 1) / 2) f = 1; else f = 0; ans += f; } } cout << ans; } void solve(){ cin >> n; bool s3 = 1; for(int i = 1; i <= n; i++){ cin >> a[i]; s3 &= (a[i] <= 2); } if(s3) sub3(); else sub12(); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL); int xach = 1; //cin >> xach; while(xach--) 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...