Submission #1207636

#TimeUsernameProblemLanguageResultExecution timeMemory
1207636witek_cppRope (JOI17_rope)C++20
100 / 100
474 ms89452 KiB
#include <iostream> #include <vector> #include <algorithm> using namespace std; typedef long long ll; #define st first #define nd second #define f(a, c, b) for (int a = c; b > a; a++) #define pb push_back #define all(a) a.begin(), a.end() #define wczytaj(a, c, n) a.resize(n); f(i, c, n) cin >> a[i]; #define sz(a) int(a.size()) #define wypisz(a, c) f(i, c, sz(a)) cout << a[i] << " "; cout << "\n"; int n, m; vector<int> a; vector<int> wstp; vector<int> ile_aktl_dodaje_p; vector<int> ile_aktl_dodaje_np; vector<int> ile_jest_takich_p; vector<int> ile_jest_takich_np; vector<vector<int>> ind; vector<int> odp; pair<int, int> maksy; int aktl_maks_p; int aktl_maks_np; void odejmij_p(int kolor) { //cout << "odjemujemy p kolor " << kolor << "\n"; ile_aktl_dodaje_p[kolor]--; ile_jest_takich_p[ile_aktl_dodaje_p[kolor]]++; ile_jest_takich_p[ile_aktl_dodaje_p[kolor] + 1]--; //cout << "kolor " << kolor << " dodaje teraz " << ile_aktl_dodaje_p[kolor] << " dla p ile jest takich ktore dodaja do p " << aktl_maks_p << " " << ile_jest_takich_p[aktl_maks_p] << "\n"; if (ile_jest_takich_p[aktl_maks_p] == 0) aktl_maks_p--; } void odejmij_np(int kolor) { //cout << "odejmujemy np kolor " << kolor << "\n"; ile_aktl_dodaje_np[kolor]--; ile_jest_takich_np[ile_aktl_dodaje_np[kolor]]++; ile_jest_takich_np[ile_aktl_dodaje_np[kolor] + 1]--; if (ile_jest_takich_np[aktl_maks_np] == 0) aktl_maks_np--; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> m; wczytaj(a, 0, n); wstp.resize(m + 1, 0); ind.resize(m + 1); f(i, 0, n) {wstp[a[i]]++; ind[a[i]].pb(i);} if (m == 0) { cout << 0; return 0; } ile_aktl_dodaje_np.resize(m + 1, 0); ile_aktl_dodaje_p.resize(m + 1, 0); ile_jest_takich_p.resize(n + 1, 0); ile_jest_takich_np.resize(n + 1, 0); f(i, 1, m + 1) { ile_aktl_dodaje_np[i] = wstp[i]; ile_aktl_dodaje_p[i] = wstp[i]; ile_jest_takich_np[wstp[i]]++; ile_jest_takich_p[wstp[i]]++; } maksy = {1, -1}; f(i, 2, m + 1) { if (wstp[maksy.st] <= wstp[i]) {maksy.nd = maksy.st; maksy.st = i;} else if (wstp[i] >= wstp[maksy.nd]) maksy.nd = i; } //cout << "maksy na start " << maksy.st << " " << maksy.nd << "\n"; odp.resize(m + 1, 0); f(i, 1, m + 1) { //cout << "rozwazamy kolor " << i << "\n"; ile_aktl_dodaje_np[i] = 0; ile_aktl_dodaje_p[i] = 0; ile_jest_takich_np[wstp[i]]--; ile_jest_takich_np[0]++; ile_jest_takich_p[wstp[i]]--; ile_jest_takich_p[0]++; /*f(i, 1, m + 1) { cout << "ind " << i << " ile aktl dodaje p " << ile_aktl_dodaje_p[i] << " a np dodaje " << ile_aktl_dodaje_np[i] << "\n"; }*/ if (i == maksy.st) aktl_maks_np = aktl_maks_p = wstp[maksy.nd]; else aktl_maks_np = aktl_maks_p = wstp[maksy.st]; //cout << "aktl maks p " << aktl_maks_p << " aktl maks np " << aktl_maks_np << "\n"; for (int ele: ind[i]) { if (ele%2 == 0) { if (ele != (n - 1) && a[ele + 1] != i) { odejmij_p(a[ele + 1]); } if (ele != 0 && a[ele - 1] != i) { odejmij_np(a[ele - 1]); } } else { if (a[ele - 1] != i) { odejmij_p(a[ele - 1]); } if (ele != (n - 1) && a[ele + 1] != i) { odejmij_np(a[ele + 1]); } } } //cout << "aktl maks p " << aktl_maks_p << " aktl maks np " << aktl_maks_np << "\n"; odp[i] = (n - wstp[i]) - max(aktl_maks_np, aktl_maks_p); ile_aktl_dodaje_np[i] = wstp[i]; ile_aktl_dodaje_p[i] = wstp[i]; ile_jest_takich_np[wstp[i]]++; ile_jest_takich_p[wstp[i]]++; ile_jest_takich_np[0]--; ile_jest_takich_p[0]--; for (int ele: ind[i]) { if (ele != 0 && a[ele - 1] != i) { ile_jest_takich_np[ile_aktl_dodaje_np[a[ele - 1]]]--; ile_jest_takich_np[wstp[a[ele - 1]]]++; ile_aktl_dodaje_np[a[ele - 1]] = wstp[a[ele - 1]]; ile_jest_takich_p[ile_aktl_dodaje_p[a[ele - 1]]]--; ile_jest_takich_p[wstp[a[ele - 1]]]++; ile_aktl_dodaje_p[a[ele - 1]] = wstp[a[ele - 1]]; } if (ele != n - 1 && a[ele + 1] != i) { ile_jest_takich_np[ile_aktl_dodaje_np[a[ele + 1]]]--; ile_jest_takich_np[wstp[a[ele + 1]]]++; ile_aktl_dodaje_np[a[ele + 1]] = wstp[a[ele + 1]]; ile_jest_takich_p[ile_aktl_dodaje_p[a[ele + 1]]]--; ile_jest_takich_p[wstp[a[ele + 1]]]++; ile_aktl_dodaje_p[a[ele + 1]] = wstp[a[ele + 1]]; } } } f(i, 1, m + 1) cout << odp[i] << "\n"; return 0; }
#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...