Submission #1065930

#TimeUsernameProblemLanguageResultExecution timeMemory
1065930Shadow1Pilot (NOI19_pilot)C++17
100 / 100
322 ms56400 KiB
// Programmer: Shadow1 #include <bits/stdc++.h> // #include <ext/pb_ds/assoc_container.hpp> // #include <ext/pb_ds/tree_policy.hpp> using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; using str = string; // yay python! #define i64 int64_t #define show(x) cerr << (#x) << " = " << (x) << '\n'; #define output_vector(v) for(auto &x : v){cout << x << " ";}cout << '\n'; #define vt vector #define pq priority_queue #define pb push_back #define eb emplace_back #define pii pair<int,int> #define umap unordered_map #define uset unordered_set #define fir first #define sec second #define sz(x) int(x.size()) #define all(x) x.begin(), x.end() #define rall(x) x.rbegin(), x.rend() // T: O(n^3) // M : O(n + k log n) const int N = 1e6; vector<int> p, ranks, set_size; void build() { p.assign(N+2, 0); ranks.assign(N+2, 0); set_size.assign(N+2, 1); for(int i=0; i<=N; ++i) p[i] = i; } int find_set(int i) { if(p[i] == i) return i; return p[i] = find_set(p[i]); } bool isSameSet(int i, int j) { return find_set(i) == find_set(j); } void unite(int i, int j) { if(isSameSet(i,j)) return; int x = find_set(i), y = find_set(j); if(ranks[x] > y) swap(x,y); p[x] = y; if(ranks[x] == ranks[y]) ++ranks[y]; set_size[y] += set_size[x]; } ll find_size(int x) { return set_size[find_set(x)]; } ll tri(ll x) { return x * (x + 1) / 2ll; } void solve() { int n, q; cin >> n >> q; vector<pair<ll,ll>> h(n); vector<bool> vis(n+1); for(int i=0; i<n; ++i) { cin >> h[i].fir; h[i].sec = i+1; } sort(all(h)); build(); vector<ll> query(1e6 + 7); ll cnt = 0; for(int i=0; i<n; ++i) { ll ind = h[i].sec; ll height = h[i].fir; query[height] = cnt; if(!vis[ind - 1] && !vis[ind + 1]) { query[height]++; }else if(vis[ind-1] && vis[ind+1]) { ll s = find_size(ind-1); query[height] -= tri(s); s = find_size(ind + 1); query[height] -= tri(s); unite(ind, ind-1); unite(ind, ind+1); s = find_size(ind); query[height] += tri(s); } else if(vis[ind-1]) { unite(ind - 1, ind); query[height] += find_size(ind); } else if(vis[ind+1]) { unite(ind, ind+1); query[height] += find_size(ind); } vis[ind] = true; cnt = query[height]; } for(int i=1; i<=1e6; ++i) { if(query[i] == 0) query[i] = query[i-1]; } while(q--) { int y; cin >> y; cout << query[y] << '\n'; } } int main() { // freopen("output.txt", "w", stdout); // freopen("input.txt", "r", stdin); ios::sync_with_stdio(false); cin.tie(NULL); int T = 1; // cin >> T; while(T--) solve(); return 0; } /* CHECK : 1. COMPARATOR FUNCTION MUST RETURN FALSE WHEN ARGUMENTS ARE EQUAL!!! 2. Overflow! Typecase int64_t on operations if varaibles are int 3. Check array bounds!!! 4. Check array indexing!!! 5. Edge cases. (N==1)!!! */
#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...
#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...