# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
479654 | 2021-10-12T16:37:50 Z | aris12345678 | Poklon (COCI17_poklon) | C++14 | 1812 ms | 11004 KB |
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; #define X first #define Y second const int mxN = 500005; const int block = 800; int cnt = 0; int a[mxN], mp[mxN]; struct Q { int X, Y, pos; }; bool comp(Q a, Q b) { if(a.X/block != b.X/block) return a.X/block < b.X/block; return a.Y < b.Y; } void add(int p) { if(mp[a[p]] == 2) cnt--; mp[a[p]]++; if(mp[a[p]] == 2) cnt++; } void remove(int p) { if(mp[a[p]] == 2) cnt--; mp[a[p]]--; if(mp[a[p]] == 2) cnt++; } int main() { int n, q; scanf("%d %d", &n, &q); map<int, int> m; for(int i = 1; i <= n; i++) { scanf("%d", &a[i]); m[a[i]]++; } int cc = 1; for(auto &x : m) x.Y = cc++; for(int i = 1; i <= n; i++) a[i] = m[a[i]]; vector<Q> queries; for(int i = 0; i < q; i++) { int l, r; scanf("%d %d", &l, &r); queries.push_back({l, r, i}); } sort(queries.begin(), queries.end(), comp); vector<int> ans(q); int ml = 1, mr = 0; for(int i = 0; i < q; i++) { int l = queries[i].X, r = queries[i].Y; while(ml > l) { ml--; add(ml); } while(mr < r) { mr++; add(mr); } while(ml < l) { remove(ml); ml++; } while(mr > r) { remove(mr); mr--; } ans[queries[i].pos] = cnt; } for(int i = 0; i < q; i++) printf("%d\n", ans[i]); return 0; }
Compilation message
# | 결과 | 실행 시간 | 메모리 | Grader output |
---|---|---|---|---|
1 | Correct | 1 ms | 204 KB | Output is correct |
2 | Correct | 1 ms | 204 KB | Output is correct |
3 | Correct | 2 ms | 332 KB | Output is correct |
4 | Correct | 10 ms | 460 KB | Output is correct |
5 | Correct | 193 ms | 2336 KB | Output is correct |
6 | Correct | 197 ms | 2400 KB | Output is correct |
7 | Correct | 497 ms | 4528 KB | Output is correct |
8 | Correct | 881 ms | 7728 KB | Output is correct |
9 | Correct | 1351 ms | 8940 KB | Output is correct |
10 | Correct | 1812 ms | 11004 KB | Output is correct |