Submission #837570

#TimeUsernameProblemLanguageResultExecution timeMemory
837570LiudasRope (JOI17_rope)C++17
80 / 100
2077 ms262144 KiB
#include <bits/stdc++.h> using namespace std; int tree[1111111 * 2] = {0}; int N = 1111111; class segment_tree{ public: void update(int head, int l, int r, int pos, int val){ if(r - l == 1){ tree[head] += val; return; } int mid = (l + r) / 2; if(pos < mid){ update(head * 2 + 1, l, mid, pos, val); } else{ update(head *2 + 2, mid, r, pos, val); } tree[head] = max(tree[head * 2 + 2], tree[head * 2 + 1]); } void update(int pos, int val){ update(0, 0, N, pos, val); } }; int arr[1000050]; int main(){ int N, M; cin >> N >> M; for(int i = 0; i < N; i ++){ cin >> arr[i]; arr[i]--; } segment_tree tre; vector<vector<unordered_map<int, int>>> brr(M + 5, vector<unordered_map<int, int>>(2)); vector<int> counts(M + 5); for(int i = 0; i < N; i ++){ for(int j = 0; j < 2; j ++){ int pi = i + 1 - (i + j) % 2 * 2; if(pi > -1 && pi < N && arr[pi] != arr[i]){ brr[arr[i]][j][arr[pi]]++; } } counts[arr[i]] ++; tre.update(arr[i], 1); } for(int i = 0; i < M; i ++){ tre.update(i, -counts[i]); int ans = N; for(int j = 0; j < 2; j ++){ for(auto &[l, r]: brr[i][j])tre.update(l, -r); ans = min(ans, N-tree[0]-counts[i]); for(auto &[l, r]: brr[i][j])tre.update(l, r); } tre.update(i, counts[i]); cout << ans << endl; } }
#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...