Soluție HackerRank pentru Array and Queries. Include cerința formatată, exemple, explicația pașilor și cod sursă.
- Problemă: Array and Queries
Cerinta completa
Given an array, you are asked to perform a number of queries and divide the array into what are called, beautiful subsequences.
The array [Expresie matematică indisponibilă în copia arhivată] has length [Expresie matematică indisponibilă în copia arhivată]. A function [Expresie matematică indisponibilă în copia arhivată] is defined to be a minimal possible [Expresie matematică indisponibilă în copia arhivată], such that it’s possible to divide array [Expresie matematică indisponibilă în copia arhivată] into [Expresie matematică indisponibilă în copia arhivată] beautiful subsequences. Note that each element of an array should belong to exactly one subsequence, and subsequence does not necessarily need to be consecutive.
A subsequence [Expresie matematică indisponibilă în copia arhivată] with length [Expresie matematică indisponibilă în copia arhivată] is called beautiful if and only if:
- [Expresie matematică indisponibilă în copia arhivată] or
- Let [Expresie matematică indisponibilă în copia arhivată] be a sorted version of [Expresie matematică indisponibilă în copia arhivată]. It must hold that [Expresie matematică indisponibilă în copia arhivată] for every [Expresie matematică indisponibilă în copia arhivată]
For instance, if [Expresie matematică indisponibilă în copia arhivată], [Expresie matematică indisponibilă în copia arhivată] would be [Expresie matematică indisponibilă în copia arhivată]. Because, you can divide [Expresie matematică indisponibilă în copia arhivată] into [Expresie matematică indisponibilă în copia arhivată] beautiful subsequences either like [Expresie matematică indisponibilă în copia arhivată] and [Expresie matematică indisponibilă în copia arhivată] or like [Expresie matematică indisponibilă în copia arhivată] and [Expresie matematică indisponibilă în copia arhivată].
You have to answer [Expresie matematică indisponibilă în copia arhivată] queries. Each query is of the type:
- [Expresie matematică indisponibilă în copia arhivată] [Expresie matematică indisponibilă în copia arhivată]: you need to change a value of [Expresie matematică indisponibilă în copia arhivată] to [Expresie matematică indisponibilă în copia arhivată], i.e. [Expresie matematică indisponibilă în copia arhivată]. Here [Expresie matematică indisponibilă în copia arhivată] is [Expresie matematică indisponibilă în copia arhivată].
After each query, for the value of [Expresie matematică indisponibilă în copia arhivată], lets denote that value as [Expresie matematică indisponibilă în copia arhivată], where [Expresie matematică indisponibilă în copia arhivată] indicates the [Expresie matematică indisponibilă în copia arhivată] query.
You need to find [Expresie matematică indisponibilă în copia arhivată] modulo [Expresie matematică indisponibilă în copia arhivată].
Input Format
The first line contains a single integer [Expresie matematică indisponibilă în copia arhivată], representing the length of array [Expresie matematică indisponibilă în copia arhivată].
The next line contains the array [Expresie matematică indisponibilă în copia arhivată] given as space-separated integers.
The next line contains a single integer [Expresie matematică indisponibilă în copia arhivată], representing the number of queries.
Each of the [Expresie matematică indisponibilă în copia arhivată] lines contain two integers [Expresie matematică indisponibilă în copia arhivată] and [Expresie matematică indisponibilă în copia arhivată], which is described above.
Constraints
- [Expresie matematică indisponibilă în copia arhivată]
- [Expresie matematică indisponibilă în copia arhivată]
- [Expresie matematică indisponibilă în copia arhivată]
- [Expresie matematică indisponibilă în copia arhivată]
Output Format
Print the required answer in one line.
Sample Input 0
5
2 2 1 1 1
2
3 2
5 5
Sample Output 0
11
Explanation 0
The initial array [Expresie matematică indisponibilă în copia arhivată] is [Expresie matematică indisponibilă în copia arhivată]
- After [Expresie matematică indisponibilă în copia arhivată] query the array becomes [Expresie matematică indisponibilă în copia arhivată] this can be divided into [Expresie matematică indisponibilă în copia arhivată] subsequences as [Expresie matematică indisponibilă în copia arhivată], [Expresie matematică indisponibilă în copia arhivată] and [Expresie matematică indisponibilă în copia arhivată].
- After [Expresie matematică indisponibilă în copia arhivată] query the array becomes [Expresie matematică indisponibilă în copia arhivată] this can be divided into [Expresie matematică indisponibilă în copia arhivată] subsequences as [Expresie matematică indisponibilă în copia arhivată], [Expresie matematică indisponibilă în copia arhivată], [Expresie matematică indisponibilă în copia arhivată] and [Expresie matematică indisponibilă în copia arhivată].

Hence, calculating [Expresie matematică indisponibilă în copia arhivată] we get
Sample Input 1
2
3 3
3
2 4
1 5
2 2
Sample Output 1
9
Explanation 1
The initial array [Expresie matematică indisponibilă în copia arhivată] is [Expresie matematică indisponibilă în copia arhivată]
- After [Expresie matematică indisponibilă în copia arhivată] query the array becomes [Expresie matematică indisponibilă în copia arhivată] this can be divided into [Expresie matematică indisponibilă în copia arhivată] subsequence as [Expresie matematică indisponibilă în copia arhivată].
- After [Expresie matematică indisponibilă în copia arhivată] query the array becomes [Expresie matematică indisponibilă în copia arhivată] this can be divided into [Expresie matematică indisponibilă în copia arhivată] subsequence as [Expresie matematică indisponibilă în copia arhivată].
- After [Expresie matematică indisponibilă în copia arhivată] query the array becomes [Expresie matematică indisponibilă în copia arhivată] this can be divided into [Expresie matematică indisponibilă în copia arhivată] subsequences as [Expresie matematică indisponibilă în copia arhivată] and [Expresie matematică indisponibilă în copia arhivată].
Hence, calculating [Expresie matematică indisponibilă în copia arhivată] we get
Limbajul de programare folosit: cpp14
Cod:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const int INF = (int) 1e9 + 123;
const ll LINF = (ll) 1e18 + 123;
const ld EPS = (ld) 1e-8;
const ll MOD = (ll) 1e9 + 7;
#define sz(x) (int) (x).size()
#define mp(x, y) make_pair(x, y)
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define lb(s, t, x) (int) (lower_bound(s, t, x) - s)
#define ub(s, t, x) (int) (upper_bound(s, t, x) - s)
#define rep(i, f, t) for (auto i = f; i < t; i++)
#define per(i, f, t) for (auto i = f; i >= t; i--)
inline void add(ll &x, ll y, ll mod = MOD) {
x += y;
if (x >= mod) x -= mod;
if (x < 0) x += mod;
}
void run();
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
run();
return 0;
}
// == SOLUTION == //
const int N = (int) 3e5 + 123;
int n, q;
int a[N];
unordered_map<int, int> cnt;
int get(int x) {
auto it = cnt.find(x);
return (it == cnt.end() ? 0 : it->second);
}
int potential(int val) {
int v = get(val);
return (v == 0 ? 0 : max(0, v - get(val - 1)));
}
int potential(vector<int> pos) {
sort(all(pos));
pos.resize(unique(all(pos)) - pos.begin());
int res = 0;
for (int p : pos) {
res += potential(p);
}
return res;
}
void run() {
cin >> n;
rep(i, 1, n + 1) {
cin >> a[i];
cnt[a[i]]++;
}
cin >> q;
ll cur = 0;
for (auto &it : cnt) {
cur += potential(it.first);
}
ll ans = 0;
rep(i, 1, q + 1) {
int id, val;
cin >> id >> val;
int was = a[id];
cur -= potential({was, was + 1, val, val + 1});
cnt[was]--;
a[id] = val;
cnt[val]++;
cur += potential({was, was + 1, val, val + 1});
add(ans, i * cur % MOD);
}
cout << ans << "\n";
}
Scor obtinut: 1.0
Submission ID: 464668424
Link challenge: https://www.hackerrank.com/challenges/array-and-queries-1/problem
